Module Name: src Committed By: riastradh Date: Sat Apr 9 23:46:19 UTC 2022
Modified Files: src/sys/kern: kern_rwlock.c Log Message: rwlock(9): Convert to membar_acquire/release. Leave an XXX comment where I suspect there might be a missing membar -- to be audited when I have more time to think! To generate a diff of this commit: cvs rdiff -u -r1.65 -r1.66 src/sys/kern/kern_rwlock.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/kern/kern_rwlock.c diff -u src/sys/kern/kern_rwlock.c:1.65 src/sys/kern/kern_rwlock.c:1.66 --- src/sys/kern/kern_rwlock.c:1.65 Sat Feb 22 21:24:45 2020 +++ src/sys/kern/kern_rwlock.c Sat Apr 9 23:46:19 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: kern_rwlock.c,v 1.65 2020/02/22 21:24:45 ad Exp $ */ +/* $NetBSD: kern_rwlock.c,v 1.66 2022/04/09 23:46:19 riastradh Exp $ */ /*- * Copyright (c) 2002, 2006, 2007, 2008, 2009, 2019, 2020 @@ -45,7 +45,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: kern_rwlock.c,v 1.65 2020/02/22 21:24:45 ad Exp $"); +__KERNEL_RCSID(0, "$NetBSD: kern_rwlock.c,v 1.66 2022/04/09 23:46:19 riastradh Exp $"); #include "opt_lockdebug.h" @@ -101,12 +101,12 @@ do { \ * Memory barriers. */ #ifdef __HAVE_ATOMIC_AS_MEMBAR -#define RW_MEMBAR_ENTER() -#define RW_MEMBAR_EXIT() +#define RW_MEMBAR_ACQUIRE() +#define RW_MEMBAR_RELEASE() #define RW_MEMBAR_PRODUCER() #else -#define RW_MEMBAR_ENTER() membar_enter() -#define RW_MEMBAR_EXIT() membar_exit() +#define RW_MEMBAR_ACQUIRE() membar_acquire() +#define RW_MEMBAR_RELEASE() membar_release() #define RW_MEMBAR_PRODUCER() membar_producer() #endif @@ -344,7 +344,7 @@ rw_vector_enter(krwlock_t *rw, const krw ~RW_WRITE_WANTED); if (__predict_true(next == owner)) { /* Got it! */ - RW_MEMBAR_ENTER(); + RW_MEMBAR_ACQUIRE(); break; } @@ -396,6 +396,7 @@ rw_vector_enter(krwlock_t *rw, const krw continue; } next = rw_cas(rw, owner, owner | set_wait); + /* XXX membar? */ if (__predict_false(next != owner)) { turnstile_exit(rw); owner = next; @@ -471,7 +472,7 @@ rw_vector_exit(krwlock_t *rw) * proceed to do direct handoff if there are waiters, and if the * lock would become unowned. */ - RW_MEMBAR_EXIT(); + RW_MEMBAR_RELEASE(); for (;;) { newown = (owner - decr); if ((newown & (RW_THREAD | RW_HAS_WAITERS)) == RW_HAS_WAITERS) @@ -585,7 +586,7 @@ rw_vector_tryenter(krwlock_t *rw, const RW_ASSERT(rw, (op != RW_READER && RW_OWNER(rw) == curthread) || (op == RW_READER && RW_COUNT(rw) != 0)); - RW_MEMBAR_ENTER(); + RW_MEMBAR_ACQUIRE(); return 1; }