Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files. =================================================================== RCS file: /ftp/cvs/cvsroot/src/sys/kern/kern_rwlock.c,v rcsdiff: /ftp/cvs/cvsroot/src/sys/kern/kern_rwlock.c,v: warning: Unknown phrases like `commitid ...;' are present. retrieving revision 1.29 retrieving revision 1.30 diff -u -p -r1.29 -r1.30 --- src/sys/kern/kern_rwlock.c 2009/04/19 08:36:04 1.29 +++ src/sys/kern/kern_rwlock.c 2009/04/24 17:53:06 1.30 @@ -1,4 +1,4 @@ -/* $NetBSD: kern_rwlock.c,v 1.29 2009/04/19 08:36:04 ad Exp $ */ +/* $NetBSD: kern_rwlock.c,v 1.30 2009/04/24 17:53:06 ad Exp $ */ /*- * Copyright (c) 2002, 2006, 2007, 2008, 2009 The NetBSD Foundation, Inc. @@ -38,7 +38,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: kern_rwlock.c,v 1.29 2009/04/19 08:36:04 ad Exp $"); +__KERNEL_RCSID(0, "$NetBSD: kern_rwlock.c,v 1.30 2009/04/24 17:53:06 ad Exp $"); #define __RWLOCK_PRIVATE @@ -341,9 +341,7 @@ rw_vector_enter(krwlock_t *rw, const krw ~RW_WRITE_WANTED); if (__predict_true(next == owner)) { /* Got it! */ -#ifndef __HAVE_ATOMIC_AS_MEMBAR membar_enter(); -#endif break; } @@ -465,9 +463,7 @@ rw_vector_exit(krwlock_t *rw) * proceed to do direct handoff if there are waiters, and if the * lock would become unowned. */ -#ifndef __HAVE_ATOMIC_AS_MEMBAR membar_exit(); -#endif for (;;) { new = (owner - decr); if ((new & (RW_THREAD | RW_HAS_WAITERS)) == RW_HAS_WAITERS) @@ -567,13 +563,11 @@ rw_vector_tryenter(krwlock_t *rw, const next = rw_cas(rw, owner, owner + incr); if (__predict_true(next == owner)) { /* Got it! */ + membar_enter(); break; } } -#ifndef __HAVE_ATOMIC_AS_MEMBAR - membar_enter(); -#endif RW_WANTLOCK(rw, op, true); RW_LOCKED(rw, op); RW_DASSERT(rw, (op != RW_READER && RW_OWNER(rw) == curthread) || @@ -600,10 +594,7 @@ rw_downgrade(krwlock_t *rw) RW_ASSERT(rw, RW_OWNER(rw) == curthread); RW_UNLOCKED(rw, RW_WRITER); -#ifndef __HAVE_ATOMIC_AS_MEMBAR membar_producer(); -#endif - owner = rw->rw_owner; if ((owner & RW_HAS_WAITERS) == 0) { /* @@ -697,8 +688,10 @@ rw_tryupgrade(krwlock_t *rw) } new = curthread | RW_WRITE_LOCKED | (owner & ~RW_THREAD); next = rw_cas(rw, owner, new); - if (__predict_true(next == owner)) + if (__predict_true(next == owner)) { + membar_producer(); break; + } } RW_UNLOCKED(rw, RW_READER); @@ -706,10 +699,6 @@ rw_tryupgrade(krwlock_t *rw) RW_DASSERT(rw, rw->rw_owner & RW_WRITE_LOCKED); RW_DASSERT(rw, RW_OWNER(rw) == curthread); -#ifndef __HAVE_ATOMIC_AS_MEMBAR - membar_producer(); -#endif - return 1; }