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>