Module Name:    src
Committed By:   riastradh
Date:           Fri Jul  7 17:05:13 UTC 2023

Modified Files:
        src/sys/kern: kern_heartbeat.c kern_lock.c

Log Message:
heartbeat(9): Test whether curcpu is stable, not kpreempt_disabled.

kpreempt_disabled worked for my testing because I tested on aarch64,
which doesn't have kpreemption.

XXX Should move curcpu_stable() to somewhere that other things can
use it.


To generate a diff of this commit:
cvs rdiff -u -r1.1 -r1.2 src/sys/kern/kern_heartbeat.c
cvs rdiff -u -r1.184 -r1.185 src/sys/kern/kern_lock.c

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_heartbeat.c
diff -u src/sys/kern/kern_heartbeat.c:1.1 src/sys/kern/kern_heartbeat.c:1.2
--- src/sys/kern/kern_heartbeat.c:1.1	Fri Jul  7 12:34:50 2023
+++ src/sys/kern/kern_heartbeat.c	Fri Jul  7 17:05:13 2023
@@ -1,4 +1,4 @@
-/*	$NetBSD: kern_heartbeat.c,v 1.1 2023/07/07 12:34:50 riastradh Exp $	*/
+/*	$NetBSD: kern_heartbeat.c,v 1.2 2023/07/07 17:05:13 riastradh Exp $	*/
 
 /*-
  * Copyright (c) 2023 The NetBSD Foundation, Inc.
@@ -78,7 +78,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: kern_heartbeat.c,v 1.1 2023/07/07 12:34:50 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: kern_heartbeat.c,v 1.2 2023/07/07 17:05:13 riastradh Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_ddb.h"
@@ -104,6 +104,16 @@ __KERNEL_RCSID(0, "$NetBSD: kern_heartbe
 #include <ddb/ddb.h>
 #endif
 
+static inline bool
+curcpu_stable(void)
+{
+
+	return kpreempt_disabled() ||
+	    (curlwp->l_pflag & LP_BOUND) ||
+	    cpu_intr_p() ||
+	    cpu_softintr_p();
+}
+
 /*
  * Global state.
  *
@@ -132,7 +142,7 @@ void
 heartbeat_suspend(void)
 {
 
-	KASSERT(kpreempt_disabled());
+	KASSERT(curcpu_stable());
 
 	/*
 	 * Nothing to do -- we just check the SPCF_OFFLINE flag.
@@ -155,7 +165,7 @@ heartbeat_resume(void)
 	struct cpu_info *ci = curcpu();
 	int s;
 
-	KASSERT(kpreempt_disabled());
+	KASSERT(curcpu_stable());
 
 	/*
 	 * Block heartbeats while we reset the state so we don't
@@ -398,7 +408,7 @@ defibrillate(struct cpu_info *ci, unsign
 	};
 	unsigned countdown = 1000; /* 1sec */
 
-	KASSERT(kpreempt_disabled());
+	KASSERT(curcpu_stable());
 
 	/*
 	 * First notify the console that the patient CPU's heart seems
@@ -449,7 +459,7 @@ select_patient(void)
 	struct cpu_info *first = NULL, *patient = NULL, *ci;
 	bool passedcur = false;
 
-	KASSERT(kpreempt_disabled());
+	KASSERT(curcpu_stable());
 
 	/*
 	 * In the iteration order of all CPUs, find the next online CPU
@@ -528,7 +538,7 @@ heartbeat(void)
 	unsigned count, uptime, cache, stamp, d;
 	struct cpu_info *patient;
 
-	KASSERT(kpreempt_disabled());
+	KASSERT(curcpu_stable());
 
 	period_ticks = atomic_load_relaxed(&heartbeat_max_period_ticks);
 	period_secs = atomic_load_relaxed(&heartbeat_max_period_secs);

Index: src/sys/kern/kern_lock.c
diff -u src/sys/kern/kern_lock.c:1.184 src/sys/kern/kern_lock.c:1.185
--- src/sys/kern/kern_lock.c:1.184	Sun Apr  9 08:17:36 2023
+++ src/sys/kern/kern_lock.c	Fri Jul  7 17:05:13 2023
@@ -1,4 +1,4 @@
-/*	$NetBSD: kern_lock.c,v 1.184 2023/04/09 08:17:36 riastradh Exp $	*/
+/*	$NetBSD: kern_lock.c,v 1.185 2023/07/07 17:05:13 riastradh Exp $	*/
 
 /*-
  * Copyright (c) 2002, 2006, 2007, 2008, 2009, 2020 The NetBSD Foundation, Inc.
@@ -31,9 +31,10 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: kern_lock.c,v 1.184 2023/04/09 08:17:36 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: kern_lock.c,v 1.185 2023/07/07 17:05:13 riastradh Exp $");
 
 #ifdef _KERNEL_OPT
+#include "opt_ddb.h"
 #include "opt_lockdebug.h"
 #endif
 
@@ -53,6 +54,10 @@ __KERNEL_RCSID(0, "$NetBSD: kern_lock.c,
 #include <sys/ksyms.h>
 #endif
 
+#ifdef DDB
+#include <ddb/ddb.h>
+#endif
+
 #include <machine/lock.h>
 
 #include <dev/lockstat.h>
@@ -116,17 +121,17 @@ panic:	panic("%s: %s caller=%p", __func_
  * so that they show up in profiles.
  */
 
+#ifdef LOCKDEBUG
 #define	_KERNEL_LOCK_ABORT(msg)						\
     LOCKDEBUG_ABORT(__func__, __LINE__, kernel_lock, &_kernel_lock_ops, msg)
-
-#ifdef LOCKDEBUG
 #define	_KERNEL_LOCK_ASSERT(cond)					\
 do {									\
 	if (!(cond))							\
 		_KERNEL_LOCK_ABORT("assertion failed: " #cond);		\
 } while (/* CONSTCOND */ 0)
 #else
-#define	_KERNEL_LOCK_ASSERT(cond)	/* nothing */
+#define	_KERNEL_LOCK_ABORT(cond)	__nothing
+#define	_KERNEL_LOCK_ASSERT(cond)	__nothing
 #endif
 
 static void	_kernel_lock_dump(const volatile void *, lockop_printer_t);
@@ -137,10 +142,6 @@ lockops_t _kernel_lock_ops = {
 	.lo_dump = _kernel_lock_dump,
 };
 
-#ifdef LOCKDEBUG
-
-#include <ddb/ddb.h>
-
 static void
 kernel_lock_trace_ipi(void *cookie)
 {
@@ -148,10 +149,10 @@ kernel_lock_trace_ipi(void *cookie)
 	printf("%s[%d %s]: hogging kernel lock\n", cpu_name(curcpu()),
 	    curlwp->l_lid,
 	    curlwp->l_name ? curlwp->l_name : curproc->p_comm);
+#ifdef DDB
 	db_stacktrace();
-}
-
 #endif
+}
 
 /*
  * Initialize the kernel lock.
@@ -195,11 +196,9 @@ _kernel_lock(int nlocks)
 	LOCKSTAT_TIMER(spintime);
 	LOCKSTAT_FLAG(lsflag);
 	struct lwp *owant;
-#ifdef LOCKDEBUG
 	static struct cpu_info *kernel_lock_holder;
 	u_int spins = 0;
 	u_int starttime = getticks();
-#endif
 	int s;
 	struct lwp *l = curlwp;
 

Reply via email to