Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/sys/kern - Add a mutex_owner_running() for the benefit of th...
details: https://anonhg.NetBSD.org/src/rev/176a470ed8e7
branches: trunk
changeset: 967460:176a470ed8e7
user: ad <ad%NetBSD.org@localhost>
date: Mon Dec 09 21:05:23 2019 +0000
description:
- Add a mutex_owner_running() for the benefit of the pagedaemon, which
needs help with locking things in reverse order.
- Expunge the panicstr checks.
- Make MUTEX_NODEBUG work for adaptive mutexes too.
diffstat:
sys/kern/kern_mutex.c | 100 ++++++++++++++++---------------------------------
1 files changed, 33 insertions(+), 67 deletions(-)
diffs (177 lines):
diff -r 98d037f9bbfa -r 176a470ed8e7 sys/kern/kern_mutex.c
--- a/sys/kern/kern_mutex.c Mon Dec 09 21:02:10 2019 +0000
+++ b/sys/kern/kern_mutex.c Mon Dec 09 21:05:23 2019 +0000
@@ -1,7 +1,7 @@
-/* $NetBSD: kern_mutex.c,v 1.80 2019/11/29 19:44:59 ad Exp $ */
+/* $NetBSD: kern_mutex.c,v 1.81 2019/12/09 21:05:23 ad Exp $ */
/*-
- * Copyright (c) 2002, 2006, 2007, 2008 The NetBSD Foundation, Inc.
+ * Copyright (c) 2002, 2006, 2007, 2008, 2019 The NetBSD Foundation, Inc.
* All rights reserved.
*
* This code is derived from software contributed to The NetBSD Foundation
@@ -40,7 +40,7 @@
#define __MUTEX_PRIVATE
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: kern_mutex.c,v 1.80 2019/11/29 19:44:59 ad Exp $");
+__KERNEL_RCSID(0, "$NetBSD: kern_mutex.c,v 1.81 2019/12/09 21:05:23 ad Exp $");
#include <sys/param.h>
#include <sys/atomic.h>
@@ -61,9 +61,6 @@
#include <machine/lock.h>
-#define MUTEX_PANIC_SKIP_SPIN 1
-#define MUTEX_PANIC_SKIP_ADAPTIVE 1
-
/*
* When not running a debug kernel, spin mutexes are not much
* more than an splraiseipl() and splx() pair.
@@ -348,46 +345,23 @@
_mutex_init(kmutex_t *mtx, kmutex_type_t type, int ipl,
uintptr_t return_address)
{
+ lockops_t *lockops __unused;
bool dodebug;
memset(mtx, 0, sizeof(*mtx));
- switch (type) {
- case MUTEX_ADAPTIVE:
- KASSERT(ipl == IPL_NONE);
- break;
- case MUTEX_DEFAULT:
- case MUTEX_DRIVER:
- if (ipl == IPL_NONE || ipl == IPL_SOFTCLOCK ||
- ipl == IPL_SOFTBIO || ipl == IPL_SOFTNET ||
- ipl == IPL_SOFTSERIAL) {
- type = MUTEX_ADAPTIVE;
- } else {
- type = MUTEX_SPIN;
- }
- break;
- default:
- break;
- }
-
- switch (type) {
- case MUTEX_NODEBUG:
- dodebug = LOCKDEBUG_ALLOC(mtx, NULL, return_address);
+ if (ipl == IPL_NONE || ipl == IPL_SOFTCLOCK ||
+ ipl == IPL_SOFTBIO || ipl == IPL_SOFTNET ||
+ ipl == IPL_SOFTSERIAL) {
+ lockops = (type == MUTEX_NODEBUG ?
+ NULL : &mutex_adaptive_lockops);
+ dodebug = LOCKDEBUG_ALLOC(mtx, lockops, return_address);
+ MUTEX_INITIALIZE_ADAPTIVE(mtx, dodebug);
+ } else {
+ lockops = (type == MUTEX_NODEBUG ?
+ NULL : &mutex_spin_lockops);
+ dodebug = LOCKDEBUG_ALLOC(mtx, lockops, return_address);
MUTEX_INITIALIZE_SPIN(mtx, dodebug, ipl);
- break;
- case MUTEX_ADAPTIVE:
- dodebug = LOCKDEBUG_ALLOC(mtx, &mutex_adaptive_lockops,
- return_address);
- MUTEX_INITIALIZE_ADAPTIVE(mtx, dodebug);
- break;
- case MUTEX_SPIN:
- dodebug = LOCKDEBUG_ALLOC(mtx, &mutex_spin_lockops,
- return_address);
- MUTEX_INITIALIZE_SPIN(mtx, dodebug, ipl);
- break;
- default:
- panic("mutex_init: impossible type");
- break;
}
}
@@ -504,10 +478,6 @@
* to reduce cache line ping-ponging between CPUs.
*/
do {
-#if MUTEX_PANIC_SKIP_SPIN
- if (panicstr != NULL)
- break;
-#endif
while (MUTEX_SPINBIT_LOCKED_P(mtx)) {
SPINLOCK_BACKOFF(count);
#ifdef LOCKDEBUG
@@ -565,12 +535,6 @@
owner = mtx->mtx_owner;
continue;
}
-#if MUTEX_PANIC_SKIP_ADAPTIVE
- if (__predict_false(panicstr != NULL)) {
- KPREEMPT_ENABLE(curlwp);
- return;
- }
-#endif
if (__predict_false(MUTEX_OWNER(owner) == curthread)) {
MUTEX_ABORT(mtx, "locking against myself");
}
@@ -746,10 +710,6 @@
if (MUTEX_SPIN_P(mtx)) {
#ifdef FULL
if (__predict_false(!MUTEX_SPINBIT_LOCKED_P(mtx))) {
-#if MUTEX_PANIC_SKIP_SPIN
- if (panicstr != NULL)
- return;
-#endif
MUTEX_ABORT(mtx, "exiting unheld spin mutex");
}
MUTEX_UNLOCKED(mtx);
@@ -759,14 +719,6 @@
return;
}
-#ifdef MUTEX_PANIC_SKIP_ADAPTIVE
- if (__predict_false((uintptr_t)panicstr | cold)) {
- MUTEX_UNLOCKED(mtx);
- MUTEX_RELEASE(mtx);
- return;
- }
-#endif
-
curthread = (uintptr_t)curlwp;
MUTEX_DASSERT(mtx, curthread != 0);
MUTEX_ASSERT(mtx, MUTEX_OWNER(mtx->mtx_owner) == curthread);
@@ -869,6 +821,24 @@
}
/*
+ * mutex_owner_running:
+ *
+ * Return true if an adaptive mutex is held and the owner is running
+ * on a CPU. For the pagedaemon.
+ */
+bool
+mutex_owner_running(const kmutex_t *mtx)
+{
+ bool rv;
+
+ MUTEX_ASSERT(mtx, MUTEX_ADAPTIVE_P(mtx));
+ kpreempt_disable();
+ rv = mutex_oncpu(MUTEX_OWNER(mtx->mtx_owner));
+ kpreempt_enable();
+ return rv;
+}
+
+/*
* mutex_ownable:
*
* When compiled with DEBUG and LOCKDEBUG defined, ensure that
@@ -956,10 +926,6 @@
* to reduce cache line ping-ponging between CPUs.
*/
do {
-#if MUTEX_PANIC_SKIP_SPIN
- if (panicstr != NULL)
- break;
-#endif
while (MUTEX_SPINBIT_LOCKED_P(mtx)) {
SPINLOCK_BACKOFF(count);
#ifdef LOCKDEBUG
Home |
Main Index |
Thread Index |
Old Index