git: 7fe33d58a826 - main - kern/kern_exit.c: extract wait6_check_alive() helper
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Sun, 25 Jan 2026 15:56:54 UTC
The branch main has been updated by kib:
URL: https://cgit.FreeBSD.org/src/commit/?id=7fe33d58a82680fcb75de7deea5a071998830b35
commit 7fe33d58a82680fcb75de7deea5a071998830b35
Author: Konstantin Belousov <kib@FreeBSD.org>
AuthorDate: 2026-01-08 04:50:03 +0000
Commit: Konstantin Belousov <kib@FreeBSD.org>
CommitDate: 2026-01-25 15:53:36 +0000
kern/kern_exit.c: extract wait6_check_alive() helper
Reviewed by: asomers, markj
Tested by: pho
Sponsored by: The FreeBSD Foundation
MFC after: 1 week
Differential revision: https://reviews.freebsd.org/D54592
---
sys/kern/kern_exit.c | 96 ++++++++++++++++++++++++++++++++--------------------
1 file changed, 59 insertions(+), 37 deletions(-)
diff --git a/sys/kern/kern_exit.c b/sys/kern/kern_exit.c
index 2b22e3a0a23b..53225bcfd425 100644
--- a/sys/kern/kern_exit.c
+++ b/sys/kern/kern_exit.c
@@ -1283,7 +1283,6 @@ report_alive_proc(struct thread *td, struct proc *p, siginfo_t *siginfo,
}
if (status != NULL)
*status = cont ? SIGCONT : W_STOPCODE(p->p_xsig);
- td->td_retval[0] = p->p_pid;
PROC_UNLOCK(p);
}
@@ -1307,6 +1306,62 @@ wait6_checkopt(int options)
return (0);
}
+/*
+ * Checks and reports status for alive process, according to the
+ * options. Returns true if the process fits one of the requested
+ * options and its status was updated in siginfo.
+ *
+ * If the process was reported (the function result is true), both the
+ * process and proctree locks are unlocked.
+ */
+static bool
+wait6_check_alive(struct thread *td, int options, struct proc *p, int *status,
+ siginfo_t *siginfo)
+{
+ bool report;
+
+ PROC_LOCK_ASSERT(p, MA_OWNED);
+ sx_assert(&proctree_lock, SA_XLOCKED);
+
+ if ((options & WTRAPPED) != 0 && (p->p_flag & P_TRACED) != 0) {
+ PROC_SLOCK(p);
+ report = (p->p_flag & (P_STOPPED_TRACE | P_STOPPED_SIG)) &&
+ p->p_suspcount == p->p_numthreads &&
+ (p->p_flag & P_WAITED) == 0;
+ PROC_SUNLOCK(p);
+ if (report) {
+ CTR4(KTR_PTRACE,
+ "wait: returning trapped pid %d status %#x (xstat %d) xthread %d",
+ p->p_pid, W_STOPCODE(p->p_xsig), p->p_xsig,
+ p->p_xthread != NULL ?
+ p->p_xthread->td_tid : -1);
+ report_alive_proc(td, p, siginfo, status,
+ options, CLD_TRAPPED);
+ return (true);
+ }
+ }
+
+ if ((options & WUNTRACED) != 0 && (p->p_flag & P_STOPPED_SIG) != 0) {
+ PROC_SLOCK(p);
+ report = p->p_suspcount == p->p_numthreads &&
+ (p->p_flag & P_WAITED) == 0;
+ PROC_SUNLOCK(p);
+ if (report) {
+ report_alive_proc(td, p, siginfo, status, options,
+ CLD_STOPPED);
+ return (true);
+ }
+ }
+
+ if ((options & WCONTINUED) != 0 && (p->p_flag & P_CONTINUED) != 0) {
+ report_alive_proc(td, p, siginfo, status, options,
+ CLD_CONTINUED);
+ return (true);
+ }
+
+ return (false);
+}
+
int
kern_wait6(struct thread *td, idtype_t idtype, id_t id, int *status,
int options, struct __wrusage *wrusage, siginfo_t *siginfo)
@@ -1314,7 +1369,6 @@ kern_wait6(struct thread *td, idtype_t idtype, id_t id, int *status,
struct proc *p, *q;
pid_t pid;
int error, nfound, ret;
- bool report;
AUDIT_ARG_VALUE((int)idtype); /* XXX - This is likely wrong! */
AUDIT_ARG_PID((pid_t)id); /* XXX - This may be wrong! */
@@ -1367,43 +1421,11 @@ loop_locked:
nfound++;
PROC_LOCK_ASSERT(p, MA_OWNED);
- if ((options & WTRAPPED) != 0 &&
- (p->p_flag & P_TRACED) != 0) {
- PROC_SLOCK(p);
- report =
- ((p->p_flag & (P_STOPPED_TRACE | P_STOPPED_SIG)) &&
- p->p_suspcount == p->p_numthreads &&
- (p->p_flag & P_WAITED) == 0);
- PROC_SUNLOCK(p);
- if (report) {
- CTR4(KTR_PTRACE,
- "wait: returning trapped pid %d status %#x (xstat %d) xthread %d",
- p->p_pid, W_STOPCODE(p->p_xsig), p->p_xsig,
- p->p_xthread != NULL ?
- p->p_xthread->td_tid : -1);
- report_alive_proc(td, p, siginfo, status,
- options, CLD_TRAPPED);
- return (0);
- }
- }
- if ((options & WUNTRACED) != 0 &&
- (p->p_flag & P_STOPPED_SIG) != 0) {
- PROC_SLOCK(p);
- report = (p->p_suspcount == p->p_numthreads &&
- ((p->p_flag & P_WAITED) == 0));
- PROC_SUNLOCK(p);
- if (report) {
- report_alive_proc(td, p, siginfo, status,
- options, CLD_STOPPED);
- return (0);
- }
- }
- if ((options & WCONTINUED) != 0 &&
- (p->p_flag & P_CONTINUED) != 0) {
- report_alive_proc(td, p, siginfo, status, options,
- CLD_CONTINUED);
+ if (wait6_check_alive(td, options, p, status, siginfo)) {
+ td->td_retval[0] = pid;
return (0);
}
+
PROC_UNLOCK(p);
}