git: 2b67cfa39d83 - main - kern/kern_exit.c: extract some helpers from proc_to_reap()

From: Konstantin Belousov <kib_at_FreeBSD.org>
Date: Sun, 25 Jan 2026 15:56:53 UTC
The branch main has been updated by kib:

URL: https://cgit.FreeBSD.org/src/commit/?id=2b67cfa39d8367a021d165681a1e7f54c6020470

commit 2b67cfa39d8367a021d165681a1e7f54c6020470
Author:     Konstantin Belousov <kib@FreeBSD.org>
AuthorDate: 2026-01-08 04:19:04 +0000
Commit:     Konstantin Belousov <kib@FreeBSD.org>
CommitDate: 2026-01-25 15:53:30 +0000

    kern/kern_exit.c: extract some helpers from proc_to_reap()
    
    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 | 116 +++++++++++++++++++++++++++++----------------------
 1 file changed, 66 insertions(+), 50 deletions(-)

diff --git a/sys/kern/kern_exit.c b/sys/kern/kern_exit.c
index db6e91f00534..2b22e3a0a23b 100644
--- a/sys/kern/kern_exit.c
+++ b/sys/kern/kern_exit.c
@@ -1042,13 +1042,75 @@ proc_reap(struct thread *td, struct proc *p, int *status, int options)
 	atomic_add_int(&nprocs, -1);
 }
 
+static void
+wait_fill_siginfo(struct proc *p, siginfo_t *siginfo)
+{
+	PROC_LOCK_ASSERT(p, MA_OWNED);
+
+	if (siginfo == NULL)
+		return;
+
+	bzero(siginfo, sizeof(*siginfo));
+	siginfo->si_errno = 0;
+
+	/*
+	 * SUSv4 requires that the si_signo value is always
+	 * SIGCHLD. Obey it despite the rfork(2) interface allows to
+	 * request other signal for child exit notification.
+	 */
+	siginfo->si_signo = SIGCHLD;
+
+	/*
+	 *  This is still a rough estimate.  We will fix the cases
+	 *  TRAPPED, STOPPED, and CONTINUED later.
+	 */
+	if (WCOREDUMP(p->p_xsig)) {
+		siginfo->si_code = CLD_DUMPED;
+		siginfo->si_status = WTERMSIG(p->p_xsig);
+	} else if (WIFSIGNALED(p->p_xsig)) {
+		siginfo->si_code = CLD_KILLED;
+		siginfo->si_status = WTERMSIG(p->p_xsig);
+	} else {
+		siginfo->si_code = CLD_EXITED;
+		siginfo->si_status = p->p_xexit;
+	}
+
+	siginfo->si_pid = p->p_pid;
+	siginfo->si_uid = p->p_ucred->cr_uid;
+
+	/*
+	 * The si_addr field would be useful additional detail, but
+	 * apparently the PC value may be lost when we reach this
+	 * point.  bzero() above sets siginfo->si_addr to NULL.
+	 */
+}
+
+static void
+wait_fill_wrusage(struct proc *p, struct __wrusage *wrusage)
+{
+	struct rusage *rup;
+
+	PROC_LOCK_ASSERT(p, MA_OWNED);
+
+	if (wrusage == NULL)
+		return;
+
+	rup = &wrusage->wru_self;
+	*rup = p->p_ru;
+	PROC_STATLOCK(p);
+	calcru(p, &rup->ru_utime, &rup->ru_stime);
+	PROC_STATUNLOCK(p);
+
+	rup = &wrusage->wru_children;
+	*rup = p->p_stats->p_cru;
+	calccru(p, &rup->ru_utime, &rup->ru_stime);
+}
+
 static int
 proc_to_reap(struct thread *td, struct proc *p, idtype_t idtype, id_t id,
     int *status, int options, struct __wrusage *wrusage, siginfo_t *siginfo,
     int check_only)
 {
-	struct rusage *rup;
-
 	sx_assert(&proctree_lock, SA_XLOCKED);
 
 	PROC_LOCK(p);
@@ -1133,60 +1195,14 @@ proc_to_reap(struct thread *td, struct proc *p, idtype_t idtype, id_t id,
 		return (0);
 	}
 
-	if (siginfo != NULL) {
-		bzero(siginfo, sizeof(*siginfo));
-		siginfo->si_errno = 0;
-
-		/*
-		 * SUSv4 requires that the si_signo value is always
-		 * SIGCHLD. Obey it despite the rfork(2) interface
-		 * allows to request other signal for child exit
-		 * notification.
-		 */
-		siginfo->si_signo = SIGCHLD;
-
-		/*
-		 *  This is still a rough estimate.  We will fix the
-		 *  cases TRAPPED, STOPPED, and CONTINUED later.
-		 */
-		if (WCOREDUMP(p->p_xsig)) {
-			siginfo->si_code = CLD_DUMPED;
-			siginfo->si_status = WTERMSIG(p->p_xsig);
-		} else if (WIFSIGNALED(p->p_xsig)) {
-			siginfo->si_code = CLD_KILLED;
-			siginfo->si_status = WTERMSIG(p->p_xsig);
-		} else {
-			siginfo->si_code = CLD_EXITED;
-			siginfo->si_status = p->p_xexit;
-		}
-
-		siginfo->si_pid = p->p_pid;
-		siginfo->si_uid = p->p_ucred->cr_uid;
-
-		/*
-		 * The si_addr field would be useful additional
-		 * detail, but apparently the PC value may be lost
-		 * when we reach this point.  bzero() above sets
-		 * siginfo->si_addr to NULL.
-		 */
-	}
+	wait_fill_siginfo(p, siginfo);
 
 	/*
 	 * There should be no reason to limit resources usage info to
 	 * exited processes only.  A snapshot about any resources used
 	 * by a stopped process may be exactly what is needed.
 	 */
-	if (wrusage != NULL) {
-		rup = &wrusage->wru_self;
-		*rup = p->p_ru;
-		PROC_STATLOCK(p);
-		calcru(p, &rup->ru_utime, &rup->ru_stime);
-		PROC_STATUNLOCK(p);
-
-		rup = &wrusage->wru_children;
-		*rup = p->p_stats->p_cru;
-		calccru(p, &rup->ru_utime, &rup->ru_stime);
-	}
+	wait_fill_wrusage(p, wrusage);
 
 	if (p->p_state == PRS_ZOMBIE && !check_only) {
 		proc_reap(td, p, status, options);