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.23 retrieving revision 1.23.2.2 diff -u -p -r1.23 -r1.23.2.2 --- src/sys/kern/kern_rwlock.c 2008/05/06 17:11:45 1.23 +++ src/sys/kern/kern_rwlock.c 2008/09/18 04:31:42 1.23.2.2 @@ -1,4 +1,4 @@ -/* $NetBSD: kern_rwlock.c,v 1.23 2008/05/06 17:11:45 ad Exp $ */ +/* $NetBSD: kern_rwlock.c,v 1.23.2.2 2008/09/18 04:31:42 wrstuden Exp $ */ /*- * Copyright (c) 2002, 2006, 2007, 2008 The NetBSD Foundation, Inc. @@ -38,9 +38,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: kern_rwlock.c,v 1.23 2008/05/06 17:11:45 ad Exp $"); - -#include "opt_multiprocessor.h" +__KERNEL_RCSID(0, "$NetBSD: kern_rwlock.c,v 1.23.2.2 2008/09/18 04:31:42 wrstuden Exp $"); #define __RWLOCK_PRIVATE @@ -67,7 +65,7 @@ __KERNEL_RCSID(0, "$NetBSD: kern_rwlock. LOCKDEBUG_WANTLOCK(RW_DEBUG_P(rw), (rw), \ (uintptr_t)__builtin_return_address(0), op == RW_READER, t); #define RW_LOCKED(rw, op) \ - LOCKDEBUG_LOCKED(RW_DEBUG_P(rw), (rw), \ + LOCKDEBUG_LOCKED(RW_DEBUG_P(rw), (rw), NULL, \ (uintptr_t)__builtin_return_address(0), op == RW_READER); #define RW_UNLOCKED(rw, op) \ LOCKDEBUG_UNLOCKED(RW_DEBUG_P(rw), (rw), \ @@ -151,7 +149,7 @@ __strong_alias(rw_tryenter,rw_vector_try lockops_t rwlock_lockops = { "Reader / writer lock", - 1, + LOCKOPS_SLEEP, rw_dump }; @@ -184,10 +182,7 @@ rw_dump(volatile void *cookie) * generates a lot of machine code in the DIAGNOSTIC case, so * we ask the compiler to not inline it. */ -#if __GNUC_PREREQ__(3, 0) -__attribute ((noinline)) -#endif -static void +static void __noinline rw_abort(krwlock_t *rw, const char *func, const char *msg) { @@ -503,7 +498,7 @@ rw_vector_exit(krwlock_t *rw) /* Give the lock to the longest waiting writer. */ l = TS_FIRST(ts, TS_WRITER_Q); new = (uintptr_t)l | RW_WRITE_LOCKED | RW_HAS_WAITERS; - if (wcnt != 0) + if (wcnt > 1) new |= RW_WRITE_WANTED; rw_swap(rw, owner, new); turnstile_wakeup(ts, TS_WRITER_Q, 1, l); @@ -638,7 +633,7 @@ rw_downgrade(krwlock_t *rw) new = RW_READ_INCR | RW_HAS_WAITERS | RW_WRITE_WANTED; next = rw_cas(rw, owner, new); - turnstile_exit(ts); + turnstile_exit(rw); if (__predict_true(next == owner)) break; } else { @@ -658,7 +653,7 @@ rw_downgrade(krwlock_t *rw) turnstile_wakeup(ts, TS_READER_Q, rcnt, NULL); break; } - turnstile_exit(ts); + turnstile_exit(rw); } }