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-all
mailing list