summaryrefslogtreecommitdiffstats
path: root/sys/kern
diff options
context:
space:
mode:
authorjhb <jhb@FreeBSD.org>2015-10-06 22:28:28 +0000
committerjhb <jhb@FreeBSD.org>2015-10-06 22:28:28 +0000
commit08449d14c723d0140fb8b505a4782d13e5745c57 (patch)
treeb782905644a30cef9fd5bc113840ff6bfaa43e0a /sys/kern
parentfd0437ce23b03438d45c73c82578740ce79533c6 (diff)
downloadFreeBSD-src-08449d14c723d0140fb8b505a4782d13e5745c57.zip
FreeBSD-src-08449d14c723d0140fb8b505a4782d13e5745c57.tar.gz
MFC 287833:
Threads holding a read lock of a sleepable rm lock are not permitted to sleep. The rmlock implementation enforces this by disabling sleeping when a read lock is acquired. To simplify the implementation, sleeping is disabled for most of the duration of rm_rlock. However, it doesn't need to be disabled until the lock is acquired. If a sleepable rm lock is contested, then rm_rlock may need to acquire the backing sx lock. This tripped the overly-broad assertion. Fix by relaxing the assertion around the call to sx_xlock().
Diffstat (limited to 'sys/kern')
-rw-r--r--sys/kern/kern_rmlock.c6
1 files changed, 4 insertions, 2 deletions
diff --git a/sys/kern/kern_rmlock.c b/sys/kern/kern_rmlock.c
index 1ac08de..194c603 100644
--- a/sys/kern/kern_rmlock.c
+++ b/sys/kern/kern_rmlock.c
@@ -402,9 +402,11 @@ _rm_rlock_hard(struct rmlock *rm, struct rm_priotracker *tracker, int trylock)
return (0);
}
} else {
- if (rm->lock_object.lo_flags & LO_SLEEPABLE)
+ if (rm->lock_object.lo_flags & LO_SLEEPABLE) {
+ THREAD_SLEEPING_OK();
sx_xlock(&rm->rm_lock_sx);
- else
+ THREAD_NO_SLEEPING();
+ } else
mtx_lock(&rm->rm_lock_mtx);
}
OpenPOWER on IntegriCloud