svn commit: r350540 - head/sys/kern

Mark Johnston markj at FreeBSD.org
Fri Aug 2 18:01:48 UTC 2019


Author: markj
Date: Fri Aug  2 18:01:47 2019
New Revision: 350540
URL: https://svnweb.freebsd.org/changeset/base/350540

Log:
  Only check the blessings table for known LORs.
  
  Previously we would check for blessings before marking a given lock
  pair as reversed, so each "reversed" lock acquisition would require
  a linear scan of the table.  Instead, check the table after marking
  the pair as reversed but before generating a report.
  
  Reviewed by:	jhb
  MFC after:	1 week
  Sponsored by:	The FreeBSD Foundation
  Differential Revision:	https://reviews.freebsd.org/D21135

Modified:
  head/sys/kern/subr_witness.c

Modified: head/sys/kern/subr_witness.c
==============================================================================
--- head/sys/kern/subr_witness.c	Fri Aug  2 16:05:36 2019	(r350539)
+++ head/sys/kern/subr_witness.c	Fri Aug  2 18:01:47 2019	(r350540)
@@ -1344,14 +1344,6 @@ witness_checkorder(struct lock_object *lock, int flags
 			 * is allowed or has already been yelled about.
 			 */
 
-			/*
-			 * If the lock order is blessed, just bail.  We don't
-			 * look for other lock order violations though, which
-			 * may be a bug.
-			 */
-			if (blessed(w, w1))
-				goto out;
-
 			/* Bail if this violation is known */
 			if (w_rmatrix[w1->w_index][w->w_index] & WITNESS_REVERSAL)
 				goto out;
@@ -1361,6 +1353,14 @@ witness_checkorder(struct lock_object *lock, int flags
 			w_rmatrix[w->w_index][w1->w_index] |= WITNESS_REVERSAL;
 			w->w_reversed = w1->w_reversed = 1;
 			witness_increment_graph_generation();
+
+			/*
+			 * If the lock order is blessed, bail before logging
+			 * anything.  We don't look for other lock order
+			 * violations though, which may be a bug.
+			 */
+			if (blessed(w, w1))
+				goto out;
 			mtx_unlock_spin(&w_mtx);
 
 #ifdef WITNESS_NO_VNODE
@@ -2650,6 +2650,9 @@ restart:
 				    &tmp_data2->wlod_stack);
 			}
 			mtx_unlock_spin(&w_mtx);
+
+			if (blessed(tmp_w1, tmp_w2))
+				continue;
 
 			sbuf_printf(sb,
 	    "\nLock order reversal between \"%s\"(%s) and \"%s\"(%s)!\n",


More information about the svn-src-head mailing list