svn commit: r326237 - head/sys/kern

Mateusz Guzik mjg at FreeBSD.org
Sun Nov 26 21:10:49 UTC 2017


Author: mjg
Date: Sun Nov 26 21:10:47 2017
New Revision: 326237
URL: https://svnweb.freebsd.org/changeset/base/326237

Log:
  rw: fix runlock_hard when new readers show up
  
  When waiters/writer spinner flags are set no new readers can show up unless
  they already have a different rw rock read locked. The change in r326195 failed
  to take that into account - in presence of new readers it would spin until
  they all drain, which would be lead to trouble if e.g. they go off cpu and
  can get scheduled because of this thread.
  
  Reported by:	pho

Modified:
  head/sys/kern/kern_rwlock.c

Modified: head/sys/kern/kern_rwlock.c
==============================================================================
--- head/sys/kern/kern_rwlock.c	Sun Nov 26 20:30:02 2017	(r326236)
+++ head/sys/kern/kern_rwlock.c	Sun Nov 26 21:10:47 2017	(r326237)
@@ -769,6 +769,11 @@ __rw_runlock_hard(struct rwlock *rw, struct thread *td
 		turnstile_chain_lock(&rw->lock_object);
 		v = RW_READ_VALUE(rw);
 retry_ts:
+		if (__predict_false(RW_READERS(v) > 1)) {
+			turnstile_chain_unlock(&rw->lock_object);
+			continue;
+		}
+
 		v &= (RW_LOCK_WAITERS | RW_LOCK_WRITE_SPINNER);
 		MPASS(v & RW_LOCK_WAITERS);
 


More information about the svn-src-head mailing list