Module Name: src Committed By: riastradh Date: Fri Feb 24 11:01:44 UTC 2023
Modified Files: src/sys/kern: kern_rwlock.c Log Message: rwlock(9): Fix membars. rw_downgrade must be a release operation, and rw_tryupgrade must be an acquire operation. membar_producer is not enough -- need to use membar_release and membar_acquire. Discussed on tech-kern: https://mail-index.netbsd.org/tech-kern/2023/02/22/msg028726.html XXX pullup-8 XXX pullup-9 XXX pullup-10 To generate a diff of this commit: cvs rdiff -u -r1.67 -r1.68 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.67 src/sys/kern/kern_rwlock.c:1.68 --- src/sys/kern/kern_rwlock.c:1.67 Fri Jan 27 09:28:41 2023 +++ src/sys/kern/kern_rwlock.c Fri Feb 24 11:01:43 2023 @@ -1,4 +1,4 @@ -/* $NetBSD: kern_rwlock.c,v 1.67 2023/01/27 09:28:41 ozaki-r Exp $ */ +/* $NetBSD: kern_rwlock.c,v 1.68 2023/02/24 11:01:43 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.67 2023/01/27 09:28:41 ozaki-r Exp $"); +__KERNEL_RCSID(0, "$NetBSD: kern_rwlock.c,v 1.68 2023/02/24 11:01:43 riastradh Exp $"); #include "opt_lockdebug.h" @@ -103,11 +103,9 @@ do { \ #ifdef __HAVE_ATOMIC_AS_MEMBAR #define RW_MEMBAR_ACQUIRE() #define RW_MEMBAR_RELEASE() -#define RW_MEMBAR_PRODUCER() #else #define RW_MEMBAR_ACQUIRE() membar_acquire() #define RW_MEMBAR_RELEASE() membar_release() -#define RW_MEMBAR_PRODUCER() membar_producer() #endif /* @@ -613,7 +611,7 @@ rw_downgrade(krwlock_t *rw) __USE(curthread); #endif - RW_MEMBAR_PRODUCER(); + RW_MEMBAR_RELEASE(); for (owner = rw->rw_owner;; owner = next) { /* @@ -712,7 +710,7 @@ rw_tryupgrade(krwlock_t *rw) newown = curthread | RW_WRITE_LOCKED | (owner & ~RW_THREAD); next = rw_cas(rw, owner, newown); if (__predict_true(next == owner)) { - RW_MEMBAR_PRODUCER(); + RW_MEMBAR_ACQUIRE(); break; } RW_ASSERT(rw, (next & RW_WRITE_LOCKED) == 0);