git: 2b67cfa39d83 - main - kern/kern_exit.c: extract some helpers from proc_to_reap()
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
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);