Module Name:    src
Committed By:   mrg
Date:           Fri Mar  1 04:32:38 UTC 2024

Modified Files:
        src/sys/kern: kern_idle.c kern_softint.c subr_workqueue.c subr_xcall.c

Log Message:
check that l_nopreempt (preemption count) doesn't change after callbacks

check that the idle loop, soft interrupt handlers, workqueue, and xcall
callbacks do not modify the preemption count, in most cases, knowing it
should be 0 currently.

this work was originally done by simonb.  cleaned up slightly and some
minor enhancement made by myself, and with discussion with riastradh@.

other callback call sites could check this as well (such as MD interrupt
handlers, or really anything that includes a callback registration.  x86
version to be commited separately.)


To generate a diff of this commit:
cvs rdiff -u -r1.35 -r1.36 src/sys/kern/kern_idle.c
cvs rdiff -u -r1.75 -r1.76 src/sys/kern/kern_softint.c
cvs rdiff -u -r1.47 -r1.48 src/sys/kern/subr_workqueue.c
cvs rdiff -u -r1.37 -r1.38 src/sys/kern/subr_xcall.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_idle.c
diff -u src/sys/kern/kern_idle.c:1.35 src/sys/kern/kern_idle.c:1.36
--- src/sys/kern/kern_idle.c:1.35	Thu Oct  5 19:10:18 2023
+++ src/sys/kern/kern_idle.c	Fri Mar  1 04:32:38 2024
@@ -1,4 +1,4 @@
-/*	$NetBSD: kern_idle.c,v 1.35 2023/10/05 19:10:18 ad Exp $	*/
+/*	$NetBSD: kern_idle.c,v 1.36 2024/03/01 04:32:38 mrg Exp $	*/
 
 /*-
  * Copyright (c)2002, 2006, 2007 YAMAMOTO Takashi,
@@ -28,7 +28,7 @@
 
 #include <sys/cdefs.h>
 
-__KERNEL_RCSID(0, "$NetBSD: kern_idle.c,v 1.35 2023/10/05 19:10:18 ad Exp $");
+__KERNEL_RCSID(0, "$NetBSD: kern_idle.c,v 1.36 2024/03/01 04:32:38 mrg Exp $");
 
 #include <sys/param.h>
 #include <sys/cpu.h>
@@ -75,6 +75,8 @@ idle_loop(void *dummy)
 		KASSERT(l == curlwp);
 		KASSERT(CURCPU_IDLE_P());
 		KASSERT(l->l_priority == PRI_IDLE);
+		KASSERTMSG(l->l_nopreempt == 0, "lwp %p nopreempt %d",
+		    l, l->l_nopreempt);
 
 		sched_idle();
 		if (!sched_curcpu_runnable_p()) {

Index: src/sys/kern/kern_softint.c
diff -u src/sys/kern/kern_softint.c:1.75 src/sys/kern/kern_softint.c:1.76
--- src/sys/kern/kern_softint.c:1.75	Fri Aug  4 12:24:36 2023
+++ src/sys/kern/kern_softint.c	Fri Mar  1 04:32:38 2024
@@ -1,4 +1,4 @@
-/*	$NetBSD: kern_softint.c,v 1.75 2023/08/04 12:24:36 riastradh Exp $	*/
+/*	$NetBSD: kern_softint.c,v 1.76 2024/03/01 04:32:38 mrg Exp $	*/
 
 /*-
  * Copyright (c) 2007, 2008, 2019, 2020 The NetBSD Foundation, Inc.
@@ -170,7 +170,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: kern_softint.c,v 1.75 2023/08/04 12:24:36 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: kern_softint.c,v 1.76 2024/03/01 04:32:38 mrg Exp $");
 
 #include <sys/param.h>
 #include <sys/proc.h>
@@ -569,6 +569,8 @@ softint_execute(lwp_t *l, int s)
 	KASSERT(si->si_cpu == curcpu());
 	KASSERT(si->si_lwp->l_wchan == NULL);
 	KASSERT(si->si_active);
+	KASSERTMSG(l->l_nopreempt == 0, "lwp %p nopreempt %d",
+	    l, l->l_nopreempt);
 
 	/*
 	 * Note: due to priority inheritance we may have interrupted a
@@ -616,6 +618,10 @@ softint_execute(lwp_t *l, int s)
 		KASSERTMSG(l->l_blcnt == 0,
 		    "%s: sh_func=%p leaked %d biglocks",
 		    __func__, sh->sh_func, curlwp->l_blcnt);
+		/* Diagnostic: check that LWP nopreempt remains zero. */
+		KASSERTMSG(l->l_nopreempt == 0,
+		    "%s: lwp %p nopreempt %d func %p",
+		    __func__, l, l->l_nopreempt, sh->sh_func);
 
 		(void)splhigh();
 	}

Index: src/sys/kern/subr_workqueue.c
diff -u src/sys/kern/subr_workqueue.c:1.47 src/sys/kern/subr_workqueue.c:1.48
--- src/sys/kern/subr_workqueue.c:1.47	Wed Aug  9 08:24:18 2023
+++ src/sys/kern/subr_workqueue.c	Fri Mar  1 04:32:38 2024
@@ -1,4 +1,4 @@
-/*	$NetBSD: subr_workqueue.c,v 1.47 2023/08/09 08:24:18 riastradh Exp $	*/
+/*	$NetBSD: subr_workqueue.c,v 1.48 2024/03/01 04:32:38 mrg Exp $	*/
 
 /*-
  * Copyright (c)2002, 2005, 2006, 2007 YAMAMOTO Takashi,
@@ -27,7 +27,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: subr_workqueue.c,v 1.47 2023/08/09 08:24:18 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: subr_workqueue.c,v 1.48 2024/03/01 04:32:38 mrg Exp $");
 
 #include <sys/param.h>
 
@@ -140,6 +140,10 @@ workqueue_runlist(struct workqueue *wq, 
 {
 	work_impl_t *wk;
 	work_impl_t *next;
+	struct lwp *l = curlwp;
+
+	KASSERTMSG(l->l_nopreempt == 0, "lwp %p nopreempt %d",
+	    l, l->l_nopreempt);
 
 	for (wk = SIMPLEQ_FIRST(list); wk != NULL; wk = next) {
 		next = SIMPLEQ_NEXT(wk, wk_entry);
@@ -148,6 +152,9 @@ workqueue_runlist(struct workqueue *wq, 
 		(*wq->wq_func)((void *)wk, wq->wq_arg);
 		SDT_PROBE4(sdt, kernel, workqueue, return,
 		    wq, wk, wq->wq_func, wq->wq_arg);
+		KASSERTMSG(l->l_nopreempt == 0,
+		    "lwp %p nopreempt %d func %p",
+		    l, l->l_nopreempt, wq->wq_func);
 	}
 }
 

Index: src/sys/kern/subr_xcall.c
diff -u src/sys/kern/subr_xcall.c:1.37 src/sys/kern/subr_xcall.c:1.38
--- src/sys/kern/subr_xcall.c:1.37	Sun Aug  6 17:50:20 2023
+++ src/sys/kern/subr_xcall.c	Fri Mar  1 04:32:38 2024
@@ -1,4 +1,4 @@
-/*	$NetBSD: subr_xcall.c,v 1.37 2023/08/06 17:50:20 riastradh Exp $	*/
+/*	$NetBSD: subr_xcall.c,v 1.38 2024/03/01 04:32:38 mrg Exp $	*/
 
 /*-
  * Copyright (c) 2007-2010, 2019 The NetBSD Foundation, Inc.
@@ -74,7 +74,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: subr_xcall.c,v 1.37 2023/08/06 17:50:20 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: subr_xcall.c,v 1.38 2024/03/01 04:32:38 mrg Exp $");
 
 #include <sys/types.h>
 #include <sys/param.h>
@@ -442,6 +442,10 @@ xc_thread(void *cookie)
 	xc_state_t *xc = &xc_low_pri;
 	void *arg1, *arg2;
 	xcfunc_t func;
+	struct lwp *l = curlwp;
+
+	KASSERTMSG(l->l_nopreempt == 0, "lwp %p nopreempt %d",
+	    l, l->l_nopreempt);
 
 	mutex_enter(&xc->xc_lock);
 	for (;;) {
@@ -461,6 +465,9 @@ xc_thread(void *cookie)
 		KASSERT(func != NULL);
 		(*func)(arg1, arg2);
 
+		KASSERTMSG(l->l_nopreempt == 0, "lwp %p nopreempt %d func %p",
+		    l, l->l_nopreempt, func);
+
 		mutex_enter(&xc->xc_lock);
 #ifdef __HAVE_ATOMIC64_LOADSTORE
 		atomic_store_release(&xc->xc_donep, xc->xc_donep + 1);

Reply via email to