git: 599d021224f2 - main - sys_procdesc: extract procdesc_alloc()
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Tue, 07 Jul 2026 01:57:11 UTC
The branch main has been updated by kib:
URL: https://cgit.FreeBSD.org/src/commit/?id=599d021224f2af3fc0befdbd6b804a328dd556f9
commit 599d021224f2af3fc0befdbd6b804a328dd556f9
Author: Konstantin Belousov <kib@FreeBSD.org>
AuthorDate: 2026-05-20 02:02:54 +0000
Commit: Konstantin Belousov <kib@FreeBSD.org>
CommitDate: 2026-07-07 01:22:20 +0000
sys_procdesc: extract procdesc_alloc()
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 | 36 ++++++++++++++++++++++++------------
1 file changed, 24 insertions(+), 12 deletions(-)
diff --git a/sys/kern/sys_procdesc.c b/sys/kern/sys_procdesc.c
index 377132af13c3..e6d8ac403dfb 100644
--- a/sys/kern/sys_procdesc.c
+++ b/sys/kern/sys_procdesc.c
@@ -201,23 +201,15 @@ sys_pdgetpid(struct thread *td, struct pdgetpid_args *uap)
return (error);
}
-/*
- * When a new process is forked by pdfork(), a file descriptor is allocated
- * by the fork code first, then the process is forked, and then we get a
- * chance to set up the process descriptor. Failure is not permitted at this
- * point, so procdesc_new() must succeed.
- */
-void
-procdesc_new(struct proc *p, int flags)
+static struct procdesc *
+procdesc_alloc(int flags)
{
struct procdesc *pd;
pd = malloc(sizeof(*pd), M_PROCDESC, M_WAITOK | M_ZERO);
- pd->pd_proc = p;
- pd->pd_pid = p->p_pid;
- p->p_procdesc = pd;
pd->pd_flags = 0;
- if (flags & PD_DAEMON)
+ 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);
@@ -227,6 +219,26 @@ procdesc_new(struct proc *p, int flags)
* struct file, and the other from their struct proc.
*/
refcount_init(&pd->pd_refcount, 2);
+
+ return (pd);
+}
+
+/*
+ * When a new process is forked by pdfork(), a file descriptor is allocated
+ * by the fork code first, then the process is forked, and then we get a
+ * chance to set up the process descriptor. Failure is not permitted at this
+ * point, so procdesc_new() must succeed.
+ */
+void
+procdesc_new(struct proc *p, int flags)
+{
+ struct procdesc *pd;
+
+ pd = procdesc_alloc(flags);
+ pd->pd_proc = p;
+ pd->pd_pid = p->p_pid;
+ MPASS(p->p_procdesc == NULL);
+ p->p_procdesc = pd;
}
/*