Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 19 Jan 2021 12:21:42 GMT
From:      Mateusz Guzik <mjg@FreeBSD.org>
To:        src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org
Subject:   git: 38baca17e01e - main - lockmgr: fix upgrade
Message-ID:  <202101191221.10JCLgWm058527@gitrepo.freebsd.org>

next in thread | raw e-mail | index | archive | help
The branch main has been updated by mjg:

URL: https://cgit.FreeBSD.org/src/commit/?id=38baca17e01e138dc9c7211c0f6cb4ba74b14449

commit 38baca17e01e138dc9c7211c0f6cb4ba74b14449
Author:     Mateusz Guzik <mjg@FreeBSD.org>
AuthorDate: 2021-01-07 06:45:49 +0000
Commit:     Mateusz Guzik <mjg@FreeBSD.org>
CommitDate: 2021-01-19 12:21:38 +0000

    lockmgr: fix upgrade
    
    TRYUPGRADE requests kept failing when they should not have due to wrong
    macro used to count readers.
    
    Fixes:  f6b091fbbd77cbb0 ("lockmgr: rewrite upgrade to stop always dropping the lock")
    Noted by:       asomers
    Differential Revision:  https://reviews.freebsd.org/D27947
---
 sys/kern/kern_lock.c | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/sys/kern/kern_lock.c b/sys/kern/kern_lock.c
index 98c6cafde702..091abcda2a1e 100644
--- a/sys/kern/kern_lock.c
+++ b/sys/kern/kern_lock.c
@@ -984,17 +984,19 @@ lockmgr_upgrade(struct lock *lk, u_int flags, struct lock_object *ilk,
 	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));
 



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