Module Name:    src
Committed By:   ad
Date:           Wed Oct  4 20:42:38 UTC 2023

Modified Files:
        src/sys/kern: kern_exit.c kern_lwp.c kern_sig.c sys_sig.c

Log Message:
Sprinkle a bunch more calls to lwp_need_userret().  There should be no
functional change but it does get rid of a bunch of assumptions about how
mi_userret() works making it easier to adjust in that in the future, and
works as a kind of documentation too.


To generate a diff of this commit:
cvs rdiff -u -r1.295 -r1.296 src/sys/kern/kern_exit.c
cvs rdiff -u -r1.258 -r1.259 src/sys/kern/kern_lwp.c
cvs rdiff -u -r1.406 -r1.407 src/sys/kern/kern_sig.c
cvs rdiff -u -r1.56 -r1.57 src/sys/kern/sys_sig.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_exit.c
diff -u src/sys/kern/kern_exit.c:1.295 src/sys/kern/kern_exit.c:1.296
--- src/sys/kern/kern_exit.c:1.295	Wed Oct  4 20:29:18 2023
+++ src/sys/kern/kern_exit.c	Wed Oct  4 20:42:38 2023
@@ -1,4 +1,4 @@
-/*	$NetBSD: kern_exit.c,v 1.295 2023/10/04 20:29:18 ad Exp $	*/
+/*	$NetBSD: kern_exit.c,v 1.296 2023/10/04 20:42:38 ad Exp $	*/
 
 /*-
  * Copyright (c) 1998, 1999, 2006, 2007, 2008, 2020, 2023
@@ -68,7 +68,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: kern_exit.c,v 1.295 2023/10/04 20:29:18 ad Exp $");
+__KERNEL_RCSID(0, "$NetBSD: kern_exit.c,v 1.296 2023/10/04 20:42:38 ad Exp $");
 
 #include "opt_ktrace.h"
 #include "opt_dtrace.h"
@@ -632,6 +632,7 @@ retry:
 			continue;
 		lwp_lock(l2);
 		l2->l_flag |= LW_WEXIT;
+		lwp_need_userret(l2);
 		if ((l2->l_stat == LSSLEEP && (l2->l_flag & LW_SINTR)) ||
 		    l2->l_stat == LSSUSPENDED || l2->l_stat == LSSTOP) {
 			l2->l_flag &= ~LW_DBGSUSPEND;
@@ -639,7 +640,6 @@ retry:
 			setrunnable(l2);
 			continue;
 		}
-		lwp_need_userret(l2);
 		lwp_unlock(l2);
 	}
 

Index: src/sys/kern/kern_lwp.c
diff -u src/sys/kern/kern_lwp.c:1.258 src/sys/kern/kern_lwp.c:1.259
--- src/sys/kern/kern_lwp.c:1.258	Wed Oct  4 20:28:06 2023
+++ src/sys/kern/kern_lwp.c	Wed Oct  4 20:42:38 2023
@@ -1,4 +1,4 @@
-/*	$NetBSD: kern_lwp.c,v 1.258 2023/10/04 20:28:06 ad Exp $	*/
+/*	$NetBSD: kern_lwp.c,v 1.259 2023/10/04 20:42:38 ad Exp $	*/
 
 /*-
  * Copyright (c) 2001, 2006, 2007, 2008, 2009, 2019, 2020, 2023
@@ -217,7 +217,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: kern_lwp.c,v 1.258 2023/10/04 20:28:06 ad Exp $");
+__KERNEL_RCSID(0, "$NetBSD: kern_lwp.c,v 1.259 2023/10/04 20:42:38 ad Exp $");
 
 #include "opt_ddb.h"
 #include "opt_lockdebug.h"
@@ -468,6 +468,7 @@ lwp_suspend(struct lwp *curl, struct lwp
 
 	case LSSLEEP:
 		t->l_flag |= LW_WSUSPEND;
+		lwp_need_userret(t);
 
 		/*
 		 * Kick the LWP and try to get it to the kernel boundary
@@ -486,6 +487,7 @@ lwp_suspend(struct lwp *curl, struct lwp
 
 	case LSSTOP:
 		t->l_flag |= LW_WSUSPEND;
+		lwp_need_userret(t);
 		setrunnable(t);
 		break;
 
@@ -962,6 +964,11 @@ lwp_create(lwp_t *l1, proc_t *p2, vaddr_
 		lwp_unlock(l1);
 	}
 
+	/* Ensure a trip through lwp_userret() if needed. */
+	if ((l2->l_flag & LW_USERRET) != 0) {
+		lwp_need_userret(l2);
+	}
+
 	/* This marks the end of the "must be atomic" section. */
 	mutex_exit(p2->p_lock);
 
@@ -1794,7 +1801,7 @@ lwp_need_userret(struct lwp *l)
 {
 
 	KASSERT(!cpu_intr_p());
-	KASSERT(lwp_locked(l, NULL));
+	KASSERT(lwp_locked(l, NULL) || l->l_stat == LSIDL);
 
 	/*
 	 * If the LWP is in any state other than LSONPROC, we know that it

Index: src/sys/kern/kern_sig.c
diff -u src/sys/kern/kern_sig.c:1.406 src/sys/kern/kern_sig.c:1.407
--- src/sys/kern/kern_sig.c:1.406	Wed Oct  4 20:29:18 2023
+++ src/sys/kern/kern_sig.c	Wed Oct  4 20:42:38 2023
@@ -1,4 +1,4 @@
-/*	$NetBSD: kern_sig.c,v 1.406 2023/10/04 20:29:18 ad Exp $	*/
+/*	$NetBSD: kern_sig.c,v 1.407 2023/10/04 20:42:38 ad Exp $	*/
 
 /*-
  * Copyright (c) 2006, 2007, 2008, 2019, 2023 The NetBSD Foundation, Inc.
@@ -70,7 +70,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: kern_sig.c,v 1.406 2023/10/04 20:29:18 ad Exp $");
+__KERNEL_RCSID(0, "$NetBSD: kern_sig.c,v 1.407 2023/10/04 20:42:38 ad Exp $");
 
 #include "opt_execfmt.h"
 #include "opt_ptrace.h"
@@ -2266,6 +2266,7 @@ sigexit(struct lwp *l, int signo)
 	if ((p->p_sflag & PS_WCORE) != 0) {
 		lwp_lock(l);
 		l->l_flag |= (LW_WCORE | LW_WEXIT | LW_WSUSPEND);
+		lwp_need_userret(l);
 		lwp_unlock(l);
 		mutex_exit(p->p_lock);
 		lwp_userret(l);
@@ -2297,6 +2298,7 @@ sigexit(struct lwp *l, int signo)
 					continue;
 				}
 				t->l_flag |= (LW_WCORE | LW_WEXIT);
+				lwp_need_userret(t);
 				lwp_suspend(l, t);
 			}
 

Index: src/sys/kern/sys_sig.c
diff -u src/sys/kern/sys_sig.c:1.56 src/sys/kern/sys_sig.c:1.57
--- src/sys/kern/sys_sig.c:1.56	Thu Apr 21 21:31:11 2022
+++ src/sys/kern/sys_sig.c	Wed Oct  4 20:42:38 2023
@@ -1,4 +1,4 @@
-/*	$NetBSD: sys_sig.c,v 1.56 2022/04/21 21:31:11 andvar Exp $	*/
+/*	$NetBSD: sys_sig.c,v 1.57 2023/10/04 20:42:38 ad Exp $	*/
 
 /*-
  * Copyright (c) 2006, 2007, 2008 The NetBSD Foundation, Inc.
@@ -66,7 +66,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: sys_sig.c,v 1.56 2022/04/21 21:31:11 andvar Exp $");
+__KERNEL_RCSID(0, "$NetBSD: sys_sig.c,v 1.57 2023/10/04 20:42:38 ad Exp $");
 
 #include "opt_dtrace.h"
 
@@ -569,6 +569,7 @@ sigaction1(struct lwp *l, int signum, co
 	if (sigispending(l, 0)) {
 		lwp_lock(l);
 		l->l_flag |= LW_PENDSIG;
+		lwp_need_userret(l);
 		lwp_unlock(l);
 	}
 out:
@@ -617,6 +618,7 @@ sigprocmask1(struct lwp *l, int how, con
 		 */
 		lwp_lock(l);
 		l->l_flag |= LW_PENDSIG;
+		lwp_need_userret(l);
 		lwp_unlock(l);
 	}
 	return 0;
@@ -655,6 +657,7 @@ sigsuspendsetup(struct lwp *l, const sig
 	if (sigispending(l, 0)) {
 		lwp_lock(l);
 		l->l_flag |= LW_PENDSIG;
+		lwp_need_userret(l);
 		lwp_unlock(l);
 	}
 	mutex_exit(p->p_lock);
@@ -671,6 +674,7 @@ sigsuspendteardown(struct lwp *l)
 		if (sigispending(l, 0)) {
 			lwp_lock(l);
 			l->l_flag |= LW_PENDSIG;
+			lwp_need_userret(l);
 			lwp_unlock(l);
 		} else {
 			l->l_sigrestore = 0;

Reply via email to