Page MenuHomeFreeBSD

D27947.diff
No OneTemporary

D27947.diff

diff --git a/sys/kern/kern_lock.c b/sys/kern/kern_lock.c
--- a/sys/kern/kern_lock.c
+++ b/sys/kern/kern_lock.c
@@ -984,17 +984,19 @@
op = flags & LK_TYPE_MASK;
v = lockmgr_read_value(lk);
for (;;) {
- if (LK_SHARERS_LOCK(v) > 1) {
+ if (LK_SHARERS(v) > 1) {
if (op == LK_TRYUPGRADE) {
LOCK_LOG2(lk, "%s: %p failed the nowait upgrade",
__func__, lk);
error = EBUSY;
goto out;
}
- if (lockmgr_sunlock_try(lk, &v)) {
+ if (atomic_fcmpset_rel_ptr(&lk->lk_lock, &v,
+ v - LK_ONE_SHARER)) {
lockmgr_note_shared_release(lk, file, line);
goto out_xlock;
}
+ continue;
}
MPASS((v & ~LK_ALL_WAITERS) == LK_SHARERS_LOCK(1));

File Metadata

Mime Type
text/plain
Expires
Sat, May 16, 5:49 PM (3 h, 36 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
33142291
Default Alt Text
D27947.diff (689 B)

Event Timeline