Module Name:    src
Committed By:   ad
Date:           Tue Jan 21 20:29:51 UTC 2020

Modified Files:
        src/sys/kern: kern_rwlock.c
        src/sys/sys: rwlock.h

Log Message:
Add a rw_owner_running() for the pagedaemon.


To generate a diff of this commit:
cvs rdiff -u -r1.62 -r1.63 src/sys/kern/kern_rwlock.c
cvs rdiff -u -r1.14 -r1.15 src/sys/sys/rwlock.h

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.62 src/sys/kern/kern_rwlock.c:1.63
--- src/sys/kern/kern_rwlock.c:1.62	Mon Jan 20 18:48:15 2020
+++ src/sys/kern/kern_rwlock.c	Tue Jan 21 20:29:51 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: kern_rwlock.c,v 1.62 2020/01/20 18:48:15 ad Exp $	*/
+/*	$NetBSD: kern_rwlock.c,v 1.63 2020/01/21 20:29:51 ad Exp $	*/
 
 /*-
  * Copyright (c) 2002, 2006, 2007, 2008, 2009, 2019, 2020
@@ -39,7 +39,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: kern_rwlock.c,v 1.62 2020/01/20 18:48:15 ad Exp $");
+__KERNEL_RCSID(0, "$NetBSD: kern_rwlock.c,v 1.63 2020/01/21 20:29:51 ad Exp $");
 
 #include "opt_lockdebug.h"
 
@@ -792,3 +792,26 @@ rw_owner(wchan_t obj)
 
 	return (void *)(owner & RW_THREAD);
 }
+
+/*
+ * rw_owner_running:
+ *
+ *	Return true if a RW lock is unheld, or write held and the owner is
+ *	running on a CPU.  For the pagedaemon.
+ */
+bool
+rw_owner_running(const krwlock_t *rw)
+{
+#ifdef MULTIPROCESSOR
+	uintptr_t owner;
+	bool rv;
+
+	kpreempt_disable();
+	owner = rw->rw_owner;
+	rv = (owner & RW_THREAD) == 0 || rw_oncpu(owner);
+	kpreempt_enable();
+	return rv;
+#else
+	return rw_owner(rw) == curlwp;
+#endif
+}

Index: src/sys/sys/rwlock.h
diff -u src/sys/sys/rwlock.h:1.14 src/sys/sys/rwlock.h:1.15
--- src/sys/sys/rwlock.h:1.14	Tue Jan 21 04:09:10 2020
+++ src/sys/sys/rwlock.h	Tue Jan 21 20:29:51 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: rwlock.h,v 1.14 2020/01/21 04:09:10 thorpej Exp $	*/
+/*	$NetBSD: rwlock.h,v 1.15 2020/01/21 20:29:51 ad Exp $	*/
 
 /*-
  * Copyright (c) 2002, 2006, 2007, 2008, 2019, 2020 The NetBSD Foundation, Inc.
@@ -84,6 +84,7 @@ void	rw_vector_enter(krwlock_t *, const 
 void	rw_vector_exit(krwlock_t *);
 int	rw_vector_tryenter(krwlock_t *, const krw_t);
 void	_rw_init(krwlock_t *, uintptr_t);
+bool	rw_owner_running(const krwlock_t *);
 #endif	/* __RWLOCK_PRIVATE */
 
 struct krwlock {

Reply via email to