The branch main has been updated by kib: URL: https://cgit.FreeBSD.org/src/commit/?id=c0e1201aaba8860bdcfd754e35024a85ceb1580a
commit c0e1201aaba8860bdcfd754e35024a85ceb1580a Author: Konstantin Belousov <[email protected]> AuthorDate: 2026-05-25 17:48:03 +0000 Commit: Konstantin Belousov <[email protected]> CommitDate: 2026-07-07 01:24:28 +0000 procdesc: make PD_DAEMON per-file Reviewed by: markj Tested by: pho Sponsored by: The FreeBSD Foundation MFC after: 1 week Differential revision: https://reviews.freebsd.org/D57124 --- sys/kern/sys_procdesc.c | 26 +++++++++++++++++--------- sys/sys/file.h | 1 + sys/sys/procdesc.h | 7 ++++++- 3 files changed, 24 insertions(+), 10 deletions(-) diff --git a/sys/kern/sys_procdesc.c b/sys/kern/sys_procdesc.c index c5be98f66749..0d57a8cc7b2c 100644 --- a/sys/kern/sys_procdesc.c +++ b/sys/kern/sys_procdesc.c @@ -209,8 +209,6 @@ procdesc_alloc(int flags) pd = malloc(sizeof(*pd), M_PROCDESC, M_WAITOK | M_ZERO); pd->pd_flags = 0; pd->pd_pid = -1; - if ((flags & PD_DAEMON) != 0) - pd->pd_flags |= PDF_DAEMON; PROCDESC_LOCK_INIT(pd); knlist_init_mtx(&pd->pd_selinfo.si_note, &pd->pd_lock); @@ -260,7 +258,12 @@ int procdesc_falloc(struct thread *td, struct file **resultfp, int *resultfd, int flags, struct filecaps *fcaps) { - return (falloc_caps(td, resultfp, resultfd, pdtofdflags(flags), fcaps)); + int error; + + error = falloc_caps(td, resultfp, resultfd, pdtofdflags(flags), fcaps); + if (error == 0 && (flags & PD_DAEMON) != 0) + (*resultfp)->f_pdflags |= F_PD_NOKILL; + return (error); } /* @@ -369,6 +372,15 @@ procdesc_reap(struct proc *p) procdesc_free(pd); } +static void +procdesc_close_tail(struct file *fp, struct proc *p) +{ + if ((fp->f_pdflags & F_PD_NOKILL) == 0) + kern_psignal(p, SIGKILL); + PROC_UNLOCK(p); + sx_xunlock(&proctree_lock); +} + /* * procdesc_close() - last close on a process descriptor. If the process is * still running, terminate with SIGKILL (unless PDF_DAEMON is set) and let @@ -436,13 +448,9 @@ procdesc_close(struct file *fp, struct thread *td) p->p_oppid = p->p_reaper->p_pid; proc_add_orphan(p, p->p_reaper); } - if ((pd->pd_flags & PDF_DAEMON) == 0) - kern_psignal(p, SIGKILL); - PROC_UNLOCK(p); - sx_xunlock(&proctree_lock); + procdesc_close_tail(fp, p); } else { - PROC_UNLOCK(p); - sx_xunlock(&proctree_lock); + procdesc_close_tail(fp, p); } } diff --git a/sys/sys/file.h b/sys/sys/file.h index f5d0778453d1..a5125d0559b1 100644 --- a/sys/sys/file.h +++ b/sys/sys/file.h @@ -213,6 +213,7 @@ struct file { union { int16_t f_seqcount[2]; /* (a) Count of seq. reads and writes. */ int f_pipegen; + int f_pdflags; /* Per-file flags for procdesc. */ }; off_t f_nextoff[2]; /* next expected read/write offset. */ union { diff --git a/sys/sys/procdesc.h b/sys/sys/procdesc.h index 08b563828b95..5fbd43f1ac84 100644 --- a/sys/sys/procdesc.h +++ b/sys/sys/procdesc.h @@ -89,7 +89,12 @@ struct procdesc { * Flags for the pd_flags field. */ #define PDF_EXITED 0x00000004 /* Process exited. */ -#define PDF_DAEMON 0x00000008 /* Don't exit when procdesc closes. */ + +/* + * Flags for file f_pdflags. + */ +#define F_PD_NOKILL 0x00000001 /* Opened with PD_DAEMON. Don't send + SIGKILL when file closes. */ /* * In-kernel interfaces to process descriptors.
