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 {