Module Name:    src
Committed By:   ad
Date:           Fri Apr 10 17:16:22 UTC 2020

Modified Files:
        src/share/man/man9: condvar.9
        src/sys/kern: kern_condvar.c kern_sleepq.c subr_lockdebug.c
        src/sys/sys: lockdebug.h lwp.h

Log Message:
- Make this needed sequence always work for condvars, by not touching the CV
  again after wakeup.  Previously it could panic because cv_signal() could
  be called by cv_wait_sig() + others:

        cv_broadcast(cv);
        cv_destroy(cv);

- In support of the above, if an LWP doing a timed wait is awoken by
  cv_broadcast() or cv_signal(), don't return an error if the timer
  fires after the fact, i.e. either succeed or fail, not both.

- Remove LOCKDEBUG code for CVs which never worked properly and is of
  questionable use.


To generate a diff of this commit:
cvs rdiff -u -r1.21 -r1.22 src/share/man/man9/condvar.9
cvs rdiff -u -r1.44 -r1.45 src/sys/kern/kern_condvar.c
cvs rdiff -u -r1.63 -r1.64 src/sys/kern/kern_sleepq.c
cvs rdiff -u -r1.75 -r1.76 src/sys/kern/subr_lockdebug.c
cvs rdiff -u -r1.21 -r1.22 src/sys/sys/lockdebug.h
cvs rdiff -u -r1.205 -r1.206 src/sys/sys/lwp.h

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/share/man/man9/condvar.9
diff -u src/share/man/man9/condvar.9:1.21 src/share/man/man9/condvar.9:1.22
--- src/share/man/man9/condvar.9:1.21	Thu Dec 12 02:34:55 2019
+++ src/share/man/man9/condvar.9	Fri Apr 10 17:16:21 2020
@@ -1,6 +1,6 @@
-.\"	$NetBSD: condvar.9,v 1.21 2019/12/12 02:34:55 pgoyette Exp $
+.\"	$NetBSD: condvar.9,v 1.22 2020/04/10 17:16:21 ad Exp $
 .\"
-.\" Copyright (c) 2006, 2007, 2008 The NetBSD Foundation, Inc.
+.\" Copyright (c) 2006, 2007, 2008, 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 12, 2019
+.Dd April 9, 2020
 .Dt CONDVAR 9
 .Os
 .Sh NAME
@@ -116,7 +116,9 @@ to display.
 .It Fn cv_destroy "cv"
 .Pp
 Release resources used by a CV.
-The CV must not be in use when it is destroyed, and must not be used afterwards.
+If there could be waiters, they should be awoken first with
+.Fn cv_broadcast .
+The CV must not be be used afterwards.
 .It Fn cv_wait "cv" "mtx"
 .Pp
 Cause the current LWP to wait non-interruptably for access to a resource,
@@ -145,10 +147,11 @@ as available until the calling LWP has b
 Non-interruptable waits have the potential to deadlock the system, and so must
 be kept short (typically, under one second).
 .Pp
-Upon being awakened, the calling LWP should verify the availability
-of the resource (or other condition).
-It should not blindly assume that the resource is now available.
-If the resource is still not available, the calling LWP may call
+.Fn cv_wait
+is typically used within a loop or restartable code sequence, because it
+may awaken spuriously.
+The calling LWP should re-check the condition that caused the wait.
+If necessary, the calling LWP may call
 .Fn cv_wait
 again to continue waiting.
 .It Fn cv_wait_sig "cv" "mtx"
@@ -234,8 +237,12 @@ more than
 .Fa bt Li "+" Fa epsilon .
 .It Fn cv_signal "cv"
 .Pp
-Awaken one LWP (potentially among many) that is waiting on the specified
-condition variable.
+Awaken one LWP waiting on the specified condition variable.
+Where there are waiters sleeping non-interruptaby, more than one
+LWP may be awoken.
+This can be used to avoid a "thundering herd" problem, where a large
+number of LWPs are awoken following an event, but only one LWP can
+process the event.
 The mutex passed to the wait function
 .Po Fa mtx Pc
 must also be held when calling

Index: src/sys/kern/kern_condvar.c
diff -u src/sys/kern/kern_condvar.c:1.44 src/sys/kern/kern_condvar.c:1.45
--- src/sys/kern/kern_condvar.c:1.44	Thu Mar 26 19:46:42 2020
+++ src/sys/kern/kern_condvar.c	Fri Apr 10 17:16:21 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: kern_condvar.c,v 1.44 2020/03/26 19:46:42 ad Exp $	*/
+/*	$NetBSD: kern_condvar.c,v 1.45 2020/04/10 17:16:21 ad Exp $	*/
 
 /*-
  * Copyright (c) 2006, 2007, 2008, 2019, 2020 The NetBSD Foundation, Inc.
@@ -34,7 +34,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: kern_condvar.c,v 1.44 2020/03/26 19:46:42 ad Exp $");
+__KERNEL_RCSID(0, "$NetBSD: kern_condvar.c,v 1.45 2020/04/10 17:16:21 ad Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -77,41 +77,7 @@ syncobj_t cv_syncobj = {
 	.sobj_owner	= syncobj_noowner,
 };
 
-lockops_t cv_lockops = {
-	.lo_name = "Condition variable",
-	.lo_type = LOCKOPS_CV,
-	.lo_dump = NULL,
-};
-
 static const char deadcv[] = "deadcv";
-#ifdef LOCKDEBUG
-static const char nodebug[] = "nodebug";
-
-#define CV_LOCKDEBUG_HANDOFF(l, cv) cv_lockdebug_handoff(l, cv)
-#define CV_LOCKDEBUG_PROCESS(l, cv) cv_lockdebug_process(l, cv)
-
-static inline void
-cv_lockdebug_handoff(lwp_t *l, kcondvar_t *cv)
-{
-
-	if (CV_DEBUG_P(cv))
-		l->l_flag |= LW_CVLOCKDEBUG;
-}
-
-static inline void
-cv_lockdebug_process(lwp_t *l, kcondvar_t *cv)
-{
-
-	if ((l->l_flag & LW_CVLOCKDEBUG) == 0)
-		return;
-
-	l->l_flag &= ~LW_CVLOCKDEBUG;
-	LOCKDEBUG_UNLOCKED(true, cv, CV_RA, 0);
-}
-#else
-#define CV_LOCKDEBUG_HANDOFF(l, cv) __nothing
-#define CV_LOCKDEBUG_PROCESS(l, cv) __nothing
-#endif
 
 /*
  * cv_init:
@@ -121,16 +87,7 @@ cv_lockdebug_process(lwp_t *l, kcondvar_
 void
 cv_init(kcondvar_t *cv, const char *wmesg)
 {
-#ifdef LOCKDEBUG
-	bool dodebug;
 
-	dodebug = LOCKDEBUG_ALLOC(cv, &cv_lockops,
-	    (uintptr_t)__builtin_return_address(0));
-	if (!dodebug) {
-		/* XXX This will break vfs_lockf. */
-		wmesg = nodebug;
-	}
-#endif
 	KASSERT(wmesg != NULL);
 	CV_SET_WMESG(cv, wmesg);
 	sleepq_init(CV_SLEEPQ(cv));
@@ -145,9 +102,9 @@ void
 cv_destroy(kcondvar_t *cv)
 {
 
-	LOCKDEBUG_FREE(CV_DEBUG_P(cv), cv);
 #ifdef DIAGNOSTIC
 	KASSERT(cv_is_valid(cv));
+	KASSERT(!cv_has_waiters(cv));
 	CV_SET_WMESG(cv, deadcv);
 #endif
 }
@@ -168,8 +125,6 @@ cv_enter(kcondvar_t *cv, kmutex_t *mtx, 
 	KASSERT(!cpu_intr_p());
 	KASSERT((l->l_pflag & LP_INTR) == 0 || panicstr != NULL);
 
-	LOCKDEBUG_LOCKED(CV_DEBUG_P(cv), cv, mtx, CV_RA, 0);
-
 	l->l_kpriority = true;
 	mp = sleepq_hashlock(cv);
 	sq = CV_SLEEPQ(cv);
@@ -180,30 +135,6 @@ cv_enter(kcondvar_t *cv, kmutex_t *mtx, 
 }
 
 /*
- * cv_exit:
- *
- *	After resuming execution, check to see if we have been restarted
- *	as a result of cv_signal().  If we have, but cannot take the
- *	wakeup (because of eg a pending Unix signal or timeout) then try
- *	to ensure that another LWP sees it.  This is necessary because
- *	there may be multiple waiters, and at least one should take the
- *	wakeup if possible.
- */
-static inline int
-cv_exit(kcondvar_t *cv, kmutex_t *mtx, lwp_t *l, const int error)
-{
-
-	mutex_enter(mtx);
-	if (__predict_false(error != 0))
-		cv_signal(cv);
-
-	LOCKDEBUG_UNLOCKED(CV_DEBUG_P(cv), cv, CV_RA, 0);
-	KASSERT(cv_is_valid(cv));
-
-	return error;
-}
-
-/*
  * cv_unsleep:
  *
  *	Remove an LWP from the condition variable and sleep queue.  This
@@ -239,14 +170,6 @@ cv_wait(kcondvar_t *cv, kmutex_t *mtx)
 	KASSERT(mutex_owned(mtx));
 
 	cv_enter(cv, mtx, l);
-
-	/*
-	 * We can't use cv_exit() here since the cv might be destroyed before
-	 * this thread gets a chance to run.  Instead, hand off the lockdebug
-	 * responsibility to the thread that wakes us up.
-	 */
-
-	CV_LOCKDEBUG_HANDOFF(l, cv);
 	(void)sleepq_block(0, false);
 	mutex_enter(mtx);
 }
@@ -269,7 +192,8 @@ cv_wait_sig(kcondvar_t *cv, kmutex_t *mt
 
 	cv_enter(cv, mtx, l);
 	error = sleepq_block(0, true);
-	return cv_exit(cv, mtx, l, error);
+	mutex_enter(mtx);
+	return error;
 }
 
 /*
@@ -291,7 +215,8 @@ cv_timedwait(kcondvar_t *cv, kmutex_t *m
 
 	cv_enter(cv, mtx, l);
 	error = sleepq_block(timo, false);
-	return cv_exit(cv, mtx, l, error);
+	mutex_enter(mtx);
+	return error;
 }
 
 /*
@@ -315,7 +240,8 @@ cv_timedwait_sig(kcondvar_t *cv, kmutex_
 
 	cv_enter(cv, mtx, l);
 	error = sleepq_block(timo, true);
-	return cv_exit(cv, mtx, l, error);
+	mutex_enter(mtx);
+	return error;
 }
 
 /*
@@ -482,7 +408,6 @@ void
 cv_signal(kcondvar_t *cv)
 {
 
-	/* LOCKDEBUG_WAKEUP(CV_DEBUG_P(cv), cv, CV_RA); */
 	KASSERT(cv_is_valid(cv));
 
 	if (__predict_false(!LIST_EMPTY(CV_SLEEPQ(cv))))
@@ -503,23 +428,29 @@ cv_wakeup_one(kcondvar_t *cv)
 	kmutex_t *mp;
 	lwp_t *l;
 
-	KASSERT(cv_is_valid(cv));
-
+	/*
+	 * Keep waking LWPs until a non-interruptable waiter is found.  An
+	 * interruptable waiter could fail to do something useful with the
+	 * wakeup due to an error return from cv_[timed]wait_sig(), and the
+	 * caller of cv_signal() may not expect such a scenario.
+	 *
+	 * This isn't a problem for non-interruptable waits (untimed and
+	 * timed), because if such a waiter is woken here it will not return
+	 * an error.
+	 */
 	mp = sleepq_hashlock(cv);
 	sq = CV_SLEEPQ(cv);
-	l = LIST_FIRST(sq);
-	if (__predict_false(l == NULL)) {
-		mutex_spin_exit(mp);
-		return;
+	while ((l = LIST_FIRST(sq)) != NULL) {
+		KASSERT(l->l_sleepq == sq);
+		KASSERT(l->l_mutex == mp);
+		KASSERT(l->l_wchan == cv);
+		if ((l->l_flag & LW_SINTR) == 0) {
+			sleepq_remove(sq, l);
+			break;
+		} else
+			sleepq_remove(sq, l);
 	}
-	KASSERT(l->l_sleepq == sq);
-	KASSERT(l->l_mutex == mp);
-	KASSERT(l->l_wchan == cv);
-	CV_LOCKDEBUG_PROCESS(l, cv);
-	sleepq_remove(sq, l);
 	mutex_spin_exit(mp);
-
-	KASSERT(cv_is_valid(cv));
 }
 
 /*
@@ -532,7 +463,6 @@ void
 cv_broadcast(kcondvar_t *cv)
 {
 
-	/* LOCKDEBUG_WAKEUP(CV_DEBUG_P(cv), cv, CV_RA); */
 	KASSERT(cv_is_valid(cv));
 
 	if (__predict_false(!LIST_EMPTY(CV_SLEEPQ(cv))))  
@@ -551,23 +481,17 @@ cv_wakeup_all(kcondvar_t *cv)
 {
 	sleepq_t *sq;
 	kmutex_t *mp;
-	lwp_t *l, *next;
-
-	KASSERT(cv_is_valid(cv));
+	lwp_t *l;
 
 	mp = sleepq_hashlock(cv);
 	sq = CV_SLEEPQ(cv);
-	for (l = LIST_FIRST(sq); l != NULL; l = next) {
+	while ((l = LIST_FIRST(sq)) != NULL) {
 		KASSERT(l->l_sleepq == sq);
 		KASSERT(l->l_mutex == mp);
 		KASSERT(l->l_wchan == cv);
-		next = LIST_NEXT(l, l_sleepchain);
-		CV_LOCKDEBUG_PROCESS(l, cv);
 		sleepq_remove(sq, l);
 	}
 	mutex_spin_exit(mp);
-
-	KASSERT(cv_is_valid(cv));
 }
 
 /*

Index: src/sys/kern/kern_sleepq.c
diff -u src/sys/kern/kern_sleepq.c:1.63 src/sys/kern/kern_sleepq.c:1.64
--- src/sys/kern/kern_sleepq.c:1.63	Thu Mar 26 19:46:42 2020
+++ src/sys/kern/kern_sleepq.c	Fri Apr 10 17:16:21 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: kern_sleepq.c,v 1.63 2020/03/26 19:46:42 ad Exp $	*/
+/*	$NetBSD: kern_sleepq.c,v 1.64 2020/04/10 17:16:21 ad Exp $	*/
 
 /*-
  * Copyright (c) 2006, 2007, 2008, 2009, 2019, 2020 The NetBSD Foundation, Inc.
@@ -35,7 +35,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: kern_sleepq.c,v 1.63 2020/03/26 19:46:42 ad Exp $");
+__KERNEL_RCSID(0, "$NetBSD: kern_sleepq.c,v 1.64 2020/04/10 17:16:21 ad Exp $");
 
 #include <sys/param.h>
 #include <sys/kernel.h>
@@ -254,7 +254,10 @@ sleepq_block(int timo, bool catch_p)
 
 	/*
 	 * If sleeping interruptably, check for pending signals, exits or
-	 * core dump events.
+	 * core dump events.  XXX The set of LW_SINTR here assumes no unlock
+	 * between sleepq_enqueue() and sleepq_block().  Unlock between
+	 * those only happens with turnstiles, which never set catch_p. 
+	 * Ugly but safe.
 	 */
 	if (catch_p) {
 		l->l_flag |= LW_SINTR;
@@ -271,6 +274,7 @@ sleepq_block(int timo, bool catch_p)
 		lwp_unsleep(l, true);
 	} else {
 		if (timo) {
+			l->l_flag &= ~LW_STIMO;
 			callout_schedule(&l->l_timeout_ch, timo);
 		}
 		spc_lock(l->l_cpu);
@@ -286,8 +290,8 @@ sleepq_block(int timo, bool catch_p)
 			 * order to keep the callout & its cache lines
 			 * co-located on the CPU with the LWP.
 			 */
-			if (callout_halt(&l->l_timeout_ch, NULL))
-				error = EWOULDBLOCK;
+			(void)callout_halt(&l->l_timeout_ch, NULL);
+			error = (l->l_flag & LW_STIMO) ? EWOULDBLOCK : 0;
 		}
 	}
 
@@ -390,6 +394,7 @@ sleepq_timeout(void *arg)
 		return;
 	}
 
+	l->l_flag |= LW_STIMO;
 	lwp_unsleep(l, true);
 }
 

Index: src/sys/kern/subr_lockdebug.c
diff -u src/sys/kern/subr_lockdebug.c:1.75 src/sys/kern/subr_lockdebug.c:1.76
--- src/sys/kern/subr_lockdebug.c:1.75	Mon Mar  9 01:47:50 2020
+++ src/sys/kern/subr_lockdebug.c	Fri Apr 10 17:16:21 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: subr_lockdebug.c,v 1.75 2020/03/09 01:47:50 christos Exp $	*/
+/*	$NetBSD: subr_lockdebug.c,v 1.76 2020/04/10 17:16:21 ad Exp $	*/
 
 /*-
  * Copyright (c) 2006, 2007, 2008, 2020 The NetBSD Foundation, Inc.
@@ -34,7 +34,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: subr_lockdebug.c,v 1.75 2020/03/09 01:47:50 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: subr_lockdebug.c,v 1.76 2020/04/10 17:16:21 ad Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_ddb.h"
@@ -505,19 +505,7 @@ lockdebug_locked(const char *func, size_
 		splx(s);
 		return;
 	}
-	if (cvlock) {
-		KASSERT(ld->ld_lockops->lo_type == LOCKOPS_CV);
-		if (lock == (void *)&lbolt) {
-			/* nothing */
-		} else if (ld->ld_shares++ == 0) {
-			ld->ld_locked = (uintptr_t)cvlock;
-		} else if (__predict_false(cvlock != (void *)ld->ld_locked)) {
-			lockdebug_abort1(func, line, ld, s,
-			    "multiple locks used with condition variable",
-			    true);
-			return;
-		}
-	} else if (shared) {
+	if (shared) {
 		l->l_shlocks++;
 		ld->ld_locked = where;
 		ld->ld_shares++;
@@ -568,13 +556,7 @@ lockdebug_unlocked(const char *func, siz
 		splx(s);
 		return;
 	}
-	if (ld->ld_lockops->lo_type == LOCKOPS_CV) {
-		if (lock == (void *)&lbolt) {
-			/* nothing */
-		} else {
-			ld->ld_shares--;
-		}
-	} else if (shared) {
+	if (shared) {
 		if (__predict_false(l->l_shlocks == 0)) {
 			lockdebug_abort1(func, line, ld, s,
 			    "no shared locks held by LWP", true);
@@ -625,41 +607,6 @@ lockdebug_unlocked(const char *func, siz
 }
 
 /*
- * lockdebug_wakeup:
- *
- *	Process a wakeup on a condition variable.
- */
-void
-lockdebug_wakeup(const char *func, size_t line, volatile void *lock,
-    uintptr_t where)
-{
-	lockdebug_t *ld;
-	int s;
-
-	if (__predict_false(panicstr != NULL || ld_panic || lock == (void *)&lbolt))
-		return;
-
-	s = splhigh();
-	/* Find the CV... */
-	if ((ld = lockdebug_lookup(func, line, lock, where)) == NULL) {
-		splx(s);
-		return;
-	}
-	/*
-	 * If it has any waiters, ensure that they are using the
-	 * same interlock.
-	 */
-	if (__predict_false(ld->ld_shares != 0 &&
-	    !mutex_owned((kmutex_t *)ld->ld_locked))) {
-		lockdebug_abort1(func, line, ld, s, "interlocking mutex not "
-		    "held during wakeup", true);
-		return;
-	}
-	__cpu_simple_unlock(&ld->ld_spinlock);
-	splx(s);
-}
-
-/*
  * lockdebug_barrier:
  *	
  *	Panic if we hold more than one specified lock, and optionally, if we
@@ -704,8 +651,6 @@ lockdebug_barrier(const char *func, size
 			if (ld->ld_lock == onelock) {
 				continue;
 			}
-			if (ld->ld_lockops->lo_type == LOCKOPS_CV)
-				continue;
 			if (ld->ld_lwp == l)
 				lockdebug_dump(l, ld, printf);
 		}
@@ -783,24 +728,20 @@ lockdebug_dump(lwp_t *l, lockdebug_t *ld
 	lo = &los;
 	db_read_bytes((db_addr_t)ld->ld_lockops, sizeof(los), (char *)lo);
 #endif
-	if (lo->lo_type == LOCKOPS_CV) {
-		(*pr)(" interlock: %#018lx\n", (long)ld->ld_locked);
-	} else {
-		(*pr)("\n"
-		    "shared holds : %18u exclusive: %18u\n"
-		    "shares wanted: %18u exclusive: %18u\n"
-		    "relevant cpu : %18u last held: %18u\n"
-		    "relevant lwp : %#018lx last held: %#018lx\n"
-		    "last locked%c : %#018lx unlocked%c: %#018lx\n",
-		    (unsigned)ld->ld_shares, ((ld->ld_flags & LD_LOCKED) != 0),
-		    (unsigned)ld->ld_shwant, (unsigned)ld->ld_exwant,
-		    (unsigned)cpu_index(l->l_cpu), (unsigned)ld->ld_cpu,
-		    (long)l, (long)ld->ld_lwp,
-		    ((ld->ld_flags & LD_LOCKED) ? '*' : ' '),
-		    (long)ld->ld_locked,
-		    ((ld->ld_flags & LD_LOCKED) ? ' ' : '*'),
-		    (long)ld->ld_unlocked);
-	}
+	(*pr)("\n"
+	    "shared holds : %18u exclusive: %18u\n"
+	    "shares wanted: %18u exclusive: %18u\n"
+	    "relevant cpu : %18u last held: %18u\n"
+	    "relevant lwp : %#018lx last held: %#018lx\n"
+	    "last locked%c : %#018lx unlocked%c: %#018lx\n",
+	    (unsigned)ld->ld_shares, ((ld->ld_flags & LD_LOCKED) != 0),
+	    (unsigned)ld->ld_shwant, (unsigned)ld->ld_exwant,
+	    (unsigned)cpu_index(l->l_cpu), (unsigned)ld->ld_cpu,
+	    (long)l, (long)ld->ld_lwp,
+	    ((ld->ld_flags & LD_LOCKED) ? '*' : ' '),
+	    (long)ld->ld_locked,
+	    ((ld->ld_flags & LD_LOCKED) ? ' ' : '*'),
+	    (long)ld->ld_unlocked);
 
 #ifdef _KERNEL
 	if (lo->lo_dump != NULL)
@@ -1009,7 +950,6 @@ lockdebug_show_lockstats(void (*pr)(cons
 	uint32_t n_spin_mutex = 0;
 	uint32_t n_adaptive_mutex = 0;
 	uint32_t n_rwlock = 0;
-	uint32_t n_cv = 0;
 	uint32_t n_others = 0;
 
 	RB_TREE_FOREACH(_ld, &ld_rb_tree) {
@@ -1018,10 +958,6 @@ lockdebug_show_lockstats(void (*pr)(cons
 			n_null++;
 			continue;
 		}
-		if (ld->ld_lockops->lo_type == LOCKOPS_CV) {
-			n_cv++;
-			continue;
-		}
 		if (ld->ld_lockops->lo_name[0] == 'M') {
 			if (ld->ld_lockops->lo_type == LOCKOPS_SLEEP)
 				n_adaptive_mutex++;
@@ -1036,13 +972,12 @@ lockdebug_show_lockstats(void (*pr)(cons
 		n_others++;
 	}
 	(*pr)(
-	    "condvar: %u\n"
 	    "spin mutex: %u\n"
 	    "adaptive mutex: %u\n"
 	    "rwlock: %u\n"
 	    "null locks: %u\n"
 	    "others: %u\n",
-	    n_cv,  n_spin_mutex, n_adaptive_mutex, n_rwlock,
+	    n_spin_mutex, n_adaptive_mutex, n_rwlock,
 	    n_null, n_others);
 #else
 	(*pr)("Sorry, kernel not built with the LOCKDEBUG option.\n");

Index: src/sys/sys/lockdebug.h
diff -u src/sys/sys/lockdebug.h:1.21 src/sys/sys/lockdebug.h:1.22
--- src/sys/sys/lockdebug.h:1.21	Thu May  9 05:00:31 2019
+++ src/sys/sys/lockdebug.h	Fri Apr 10 17:16:21 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: lockdebug.h,v 1.21 2019/05/09 05:00:31 ozaki-r Exp $	*/
+/*	$NetBSD: lockdebug.h,v 1.22 2020/04/10 17:16:21 ad Exp $	*/
 
 /*-
  * Copyright (c) 2006, 2007, 2008 The NetBSD Foundation, Inc.
@@ -42,7 +42,6 @@
 
 #define	LOCKOPS_SLEEP	0
 #define	LOCKOPS_SPIN	1
-#define	LOCKOPS_CV	2
 
 typedef void (*lockop_printer_t)(const char *, ...) __printflike(1, 2);
 
@@ -78,7 +77,6 @@ void	lockdebug_unlocked(const char *, si
     uintptr_t, int);
 void	lockdebug_barrier(const char *, size_t, volatile void *, int);
 void	lockdebug_mem_check(const char *, size_t, void *, size_t);
-void	lockdebug_wakeup(const char *, size_t, volatile void *, uintptr_t);
 
 #define	LOCKDEBUG_ALLOC(lock, ops, addr) \
     lockdebug_alloc(__func__, __LINE__, lock, ops, addr)
@@ -94,8 +92,6 @@ void	lockdebug_wakeup(const char *, size
     lockdebug_barrier(__func__, __LINE__, lock, slp)
 #define	LOCKDEBUG_MEM_CHECK(base, sz)	\
     lockdebug_mem_check(__func__, __LINE__, base, sz)
-#define	LOCKDEBUG_WAKEUP(dodebug, lock, where)	\
-    if (dodebug) lockdebug_wakeup(__func__, __LINE__, lock, where)
 
 #else	/* LOCKDEBUG */
 
@@ -106,7 +102,6 @@ void	lockdebug_wakeup(const char *, size
 #define	LOCKDEBUG_UNLOCKED(dodebug, lock, where, s)	/* nothing */
 #define	LOCKDEBUG_BARRIER(lock, slp)			/* nothing */
 #define	LOCKDEBUG_MEM_CHECK(base, sz)			/* nothing */
-#define	LOCKDEBUG_WAKEUP(dodebug, lock, where)		/* nothing */
 
 #endif	/* LOCKDEBUG */
 

Index: src/sys/sys/lwp.h
diff -u src/sys/sys/lwp.h:1.205 src/sys/sys/lwp.h:1.206
--- src/sys/sys/lwp.h:1.205	Sat Apr  4 20:20:12 2020
+++ src/sys/sys/lwp.h	Fri Apr 10 17:16:21 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: lwp.h,v 1.205 2020/04/04 20:20:12 thorpej Exp $	*/
+/*	$NetBSD: lwp.h,v 1.206 2020/04/10 17:16:21 ad Exp $	*/
 
 /*
  * Copyright (c) 2001, 2006, 2007, 2008, 2009, 2010, 2019, 2020
@@ -263,7 +263,7 @@ extern int		maxlwp __read_mostly;	/* max
  */
 #define	LW_IDLE		0x00000001 /* Idle lwp. */
 #define	LW_LWPCTL	0x00000002 /* Adjust lwpctl in userret */
-#define	LW_CVLOCKDEBUG	0x00000004 /* Waker does lockdebug */
+#define	LW_STIMO	0x00000040 /* Sleep timed out */
 #define	LW_SINTR	0x00000080 /* Sleep is interruptible. */
 #define	LW_SYSTEM	0x00000200 /* Kernel thread */
 #define	LW_DBGSUSPEND	0x00010000 /* Suspend by debugger */

Reply via email to