procctl: add state flags to PROC_REAP_GETPIDS reports

For a process supervisor using the reaper API to track process subtrees,
it is very useful to know the state of the processes on the list.

Sponsored by:   https://www.patreon.com/valpackett
Reviewed by:    kib
MFC after:	1 week
Differential Revision: https://reviews.freebsd.org/D39585
This commit is contained in:
Val Packett 2023-04-15 14:59:30 -03:00 committed by Konstantin Belousov
parent 82a036d86a
commit 77f0e198d9
3 changed files with 17 additions and 2 deletions

View File

@ -29,7 +29,7 @@
.\"
.\" $FreeBSD$
.\"
.Dd September 2, 2021
.Dd April 15, 2023
.Dt PROCCTL 2
.Os
.Sh NAME
@ -302,7 +302,7 @@ of the process.
The
.Fa pi_flags
field returns the following flags, further describing the descendant:
.Bl -tag -width REAPER_PIDINFO_REAPER
.Bl -tag -width REAPER_PIDINFO_EXITING
.It Dv REAPER_PIDINFO_VALID
Set to indicate that the
.Vt procctl_reaper_pidinfo
@ -320,6 +320,12 @@ field identifies the direct child of the reaper.
.It Dv REAPER_PIDINFO_REAPER
The reported process is itself a reaper.
The descendants of the subordinate reaper are not reported.
.It Dv REAPER_PIDINFO_ZOMBIE
The reported process is in the zombie state, ready to be reaped.
.It Dv REAPER_PIDINFO_STOPPED
The reported process is stopped by a SIGSTOP/SIGTSTP signal.
.It Dv REAPER_PIDINFO_EXITING
The reported process is in the process of exiting (but not yet a zombie).
.El
.It Dv PROC_REAP_KILL
Request to deliver a signal to some subset of the descendants of the reaper.

View File

@ -234,6 +234,12 @@ reap_getpids(struct thread *td, struct proc *p, void *data)
pip->pi_flags |= REAPER_PIDINFO_CHILD;
if ((p2->p_treeflag & P_TREE_REAPER) != 0)
pip->pi_flags |= REAPER_PIDINFO_REAPER;
if ((p2->p_flag & P_STOPPED) != 0)
pip->pi_flags |= REAPER_PIDINFO_STOPPED;
if (p2->p_state == PRS_ZOMBIE)
pip->pi_flags |= REAPER_PIDINFO_ZOMBIE;
else if ((p2->p_flag & P_WEXIT) != 0)
pip->pi_flags |= REAPER_PIDINFO_EXITING;
i++;
}
sx_sunlock(&proctree_lock);

View File

@ -102,6 +102,9 @@ struct procctl_reaper_pidinfo {
#define REAPER_PIDINFO_VALID 0x00000001
#define REAPER_PIDINFO_CHILD 0x00000002
#define REAPER_PIDINFO_REAPER 0x00000004
#define REAPER_PIDINFO_ZOMBIE 0x00000008
#define REAPER_PIDINFO_STOPPED 0x00000010
#define REAPER_PIDINFO_EXITING 0x00000020
struct procctl_reaper_pids {
u_int rp_count;