Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 14 May 2018 00:14:01 +0000 (UTC)
From:      Matt Macy <mmacy@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r333595 - head/sys/kern
Message-ID:  <201805140014.w4E0E17W023239@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: mmacy
Date: Mon May 14 00:14:00 2018
New Revision: 333595
URL: https://svnweb.freebsd.org/changeset/base/333595

Log:
  epoch(9): allow sx locks to be held across epoch_wait()
  
  The INVARIANTS checks in epoch_wait() were intended to
  prevent the block handler from returning with locks held.
  What it in fact did was preventing anything except Giant
  from being held across it. Check that the number of locks
  held has not changed instead.
  
  Approved by:	sbruno@

Modified:
  head/sys/kern/subr_epoch.c

Modified: head/sys/kern/subr_epoch.c
==============================================================================
--- head/sys/kern/subr_epoch.c	Sun May 13 23:56:43 2018	(r333594)
+++ head/sys/kern/subr_epoch.c	Mon May 14 00:14:00 2018	(r333595)
@@ -469,7 +469,11 @@ epoch_wait(epoch_t epoch)
 	int old_cpu;
 	int old_pinned;
 	u_char old_prio;
+#ifdef INVARIANTS
+	int locks;
 
+	locks = curthread->td_locks;
+#endif
 	INIT_CHECK(epoch);
 
 	WITNESS_WARN(WARN_GIANTOK | WARN_SLEEPOK, NULL,
@@ -506,9 +510,9 @@ epoch_wait(epoch_t epoch)
 	/* restore thread priority */
 	sched_prio(td, old_prio);
 	thread_unlock(td);
-	KASSERT(td->td_locks == 0,
-			("%d locks held", td->td_locks));
 	PICKUP_GIANT();
+	KASSERT(td->td_locks == locks,
+			("%d residual locks held", td->td_locks - locks));
 }
 
 void



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201805140014.w4E0E17W023239>