Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys/sys Add rw_lock_op(): return either RW_READER or RW_WRIT...



details:   https://anonhg.NetBSD.org/src/rev/8e37178c4b80
branches:  trunk
changeset: 1007558:8e37178c4b80
user:      ad <ad%NetBSD.org@localhost>
date:      Sat Feb 22 21:24:44 2020 +0000

description:
Add rw_lock_op(): return either RW_READER or RW_WRITER for a lock that is
known to be held by the caller.  Panic if the lock is not held.

diffstat:

 distrib/sets/lists/comp/mi |   5 ++++-
 share/man/man9/rwlock.9    |  40 ++++++++++++++++++++++++++--------------
 sys/kern/kern_rwlock.c     |  19 +++++++++++++++++--
 sys/sys/rwlock.h           |   3 ++-
 4 files changed, 49 insertions(+), 18 deletions(-)

diffs (185 lines):

diff -r 85c175c3a688 -r 8e37178c4b80 distrib/sets/lists/comp/mi
--- a/distrib/sets/lists/comp/mi        Sat Feb 22 21:07:46 2020 +0000
+++ b/distrib/sets/lists/comp/mi        Sat Feb 22 21:24:44 2020 +0000
@@ -1,4 +1,4 @@
-#      $NetBSD: mi,v 1.2310 2020/02/07 18:48:58 kamil Exp $
+#      $NetBSD: mi,v 1.2311 2020/02/22 21:24:44 ad Exp $
 #
 # Note: don't delete entries from here - mark them as "obsolete" instead.
 ./etc/mtree/set.comp                           comp-sys-root
@@ -11792,6 +11792,7 @@
 ./usr/share/man/cat9/rw_exit.0                 comp-sys-catman         .cat
 ./usr/share/man/cat9/rw_init.0                 comp-sys-catman         .cat
 ./usr/share/man/cat9/rw_lock_held.0            comp-sys-catman         .cat
+./usr/share/man/cat9/rw_lock_op.0              comp-sys-catman         .cat
 ./usr/share/man/cat9/rw_read_held.0            comp-sys-catman         .cat
 ./usr/share/man/cat9/rw_tryenter.0             comp-sys-catman         .cat
 ./usr/share/man/cat9/rw_tryupgrade.0           comp-sys-catman         .cat
@@ -19710,6 +19711,7 @@
 ./usr/share/man/html9/rw_exit.html             comp-sys-htmlman        html
 ./usr/share/man/html9/rw_init.html             comp-sys-htmlman        html
 ./usr/share/man/html9/rw_lock_held.html                comp-sys-htmlman        html
+./usr/share/man/html9/rw_lock_op.html          comp-sys-htmlman        html
 ./usr/share/man/html9/rw_read_held.html                comp-sys-htmlman        html
 ./usr/share/man/html9/rw_tryenter.html         comp-sys-htmlman        html
 ./usr/share/man/html9/rw_tryupgrade.html       comp-sys-htmlman        html
@@ -27811,6 +27813,7 @@
 ./usr/share/man/man9/rw_exit.9                 comp-sys-man            .man
 ./usr/share/man/man9/rw_init.9                 comp-sys-man            .man
 ./usr/share/man/man9/rw_lock_held.9            comp-sys-man            .man
+./usr/share/man/man9/rw_lock_op.9              comp-sys-man            .man
 ./usr/share/man/man9/rw_read_held.9            comp-sys-man            .man
 ./usr/share/man/man9/rw_tryenter.9             comp-sys-man            .man
 ./usr/share/man/man9/rw_tryupgrade.9           comp-sys-man            .man
diff -r 85c175c3a688 -r 8e37178c4b80 share/man/man9/rwlock.9
--- a/share/man/man9/rwlock.9   Sat Feb 22 21:07:46 2020 +0000
+++ b/share/man/man9/rwlock.9   Sat Feb 22 21:24:44 2020 +0000
@@ -1,6 +1,6 @@
-.\"    $NetBSD: rwlock.9,v 1.19 2018/12/10 20:12:36 jdolecek Exp $
+.\"    $NetBSD: rwlock.9,v 1.20 2020/02/22 21:24:45 ad Exp $
 .\"
-.\" Copyright (c) 2006, 2007, 2009 The NetBSD Foundation, Inc.
+.\" Copyright (c) 2006, 2007, 2009, 2020 The NetBSD Foundation, Inc.
 .\" All rights reserved.
 .\"
 .\" This code is derived from software contributed to The NetBSD Foundation
@@ -27,7 +27,7 @@
 .\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 .\" POSSIBILITY OF SUCH DAMAGE.
 .\"
-.Dd December 10, 2018
+.Dd February 22, 2020
 .Dt RWLOCK 9
 .Os
 .Sh NAME
@@ -41,7 +41,8 @@
 .Nm rw_downgrade ,
 .Nm rw_read_held ,
 .Nm rw_write_held ,
-.Nm rw_lock_held
+.Nm rw_lock_held ,
+.Nm rw_lock_op
 .Nd reader / writer lock primitives
 .Sh SYNOPSIS
 .In sys/rwlock.h
@@ -65,6 +66,8 @@
 .Fn rw_write_held "krwlock_t *rw"
 .Ft int
 .Fn rw_lock_held "krwlock_t *rw"
+.Ft krw_t
+.Fn rw_lock_op "krwlock_t *rw"
 .Pp
 .Cd "options DIAGNOSTIC"
 .Cd "options LOCKDEBUG"
@@ -130,8 +133,7 @@
 is specified as the argument to
 .Fa op ,
 acquire a read lock.
-If the lock is write held, the caller will block and not return until the
-hold is acquired.
+The caller may block and will not return until the hold is acquired.
 Callers must not recursively acquire read locks.
 .Pp
 If
@@ -172,6 +174,7 @@
 Return non-zero if write lock is held by current lwp.
 Otherwise, return zero.
 .It Fn rw_read_held "rw"
+.Pp
 Returns non-zero if read lock is held by any lwp.
 Otherwise, return zero.
 .It Fn rw_lock_held "rw"
@@ -179,19 +182,28 @@
 Returns non-zero if either read or write lock is held by any lwp.
 Otherwise, return zero.
 .Pp
-Functions
 .Fn rw_write_held ,
 .Fn rw_read_held ,
 and
 .Fn rw_lock_held
-must never be used to make locking decisions at run time:
-they are provided only for diagnostic purposes.
-They are also not atomic, hence they should only be used to assert
-that lock is held.
-The only exception is
+should not generally be used to make locking decisions at run time:
+they are provided for diagnostic purposes, for example making
+assertions.
+.Pp
+Negative assertions (lock not held) should not be made due to atomicity
+issues, excepting
 .Fn rw_write_held ,
-which can be also used safely to assert that write lock is NOT currently
-held by current lwp.
+which can safely be used to assert that a write lock is NOT held by
+the current LWP.
+.It Fn rw_lock_op "rw"
+.Pp
+For a lock that is known to be held by the calling LWP, return either
+.Dv RW_READER
+or
+.Dv RW_WRITER
+to denote the type of hold.
+This is useful when dropping and later re-acquiring a lock, if the type
+of hold is not already known.
 .El
 .Sh PERFORMANCE CONSIDERATIONS
 RW locks are subject to high cache contention on multiprocessor systems,
diff -r 85c175c3a688 -r 8e37178c4b80 sys/kern/kern_rwlock.c
--- a/sys/kern/kern_rwlock.c    Sat Feb 22 21:07:46 2020 +0000
+++ b/sys/kern/kern_rwlock.c    Sat Feb 22 21:24:44 2020 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: kern_rwlock.c,v 1.64 2020/01/22 12:44:54 ad Exp $      */
+/*     $NetBSD: kern_rwlock.c,v 1.65 2020/02/22 21:24:45 ad 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.64 2020/01/22 12:44:54 ad Exp $");
+__KERNEL_RCSID(0, "$NetBSD: kern_rwlock.c,v 1.65 2020/02/22 21:24:45 ad Exp $");
 
 #include "opt_lockdebug.h"
 
@@ -782,6 +782,21 @@
 }
 
 /*
+ * rw_lock_op:
+ *
+ *     For a rwlock that is known to be held by the caller, return
+ *     RW_READER or RW_WRITER to describe the hold type.
+ */
+krw_t
+rw_lock_op(krwlock_t *rw)
+{
+
+       RW_ASSERT(rw, rw_lock_held(rw));
+
+       return (rw->rw_owner & RW_WRITE_LOCKED) != 0 ? RW_WRITER : RW_READER;
+}
+
+/*
  * rw_owner:
  *
  *     Return the current owner of an RW lock, but only if it is write
diff -r 85c175c3a688 -r 8e37178c4b80 sys/sys/rwlock.h
--- a/sys/sys/rwlock.h  Sat Feb 22 21:07:46 2020 +0000
+++ b/sys/sys/rwlock.h  Sat Feb 22 21:24:44 2020 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: rwlock.h,v 1.15 2020/01/21 20:29:51 ad Exp $   */
+/*     $NetBSD: rwlock.h,v 1.16 2020/02/22 21:24:45 ad Exp $   */
 
 /*-
  * Copyright (c) 2002, 2006, 2007, 2008, 2019, 2020 The NetBSD Foundation, Inc.
@@ -103,6 +103,7 @@
 int    rw_read_held(krwlock_t *);
 int    rw_write_held(krwlock_t *);
 int    rw_lock_held(krwlock_t *);
+krw_t  rw_lock_op(krwlock_t *);
 
 void   rw_enter(krwlock_t *, const krw_t);
 void   rw_exit(krwlock_t *);



Home | Main Index | Thread Index | Old Index