Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 26 Nov 2017 21:10:48 +0000 (UTC)
From:      Mateusz Guzik <mjg@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r326237 - head/sys/kern
Message-ID:  <201711262110.vAQLAmNF043213@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
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);
 



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