git: 599d021224f2 - main - sys_procdesc: extract procdesc_alloc()

From: Konstantin Belousov <kib_at_FreeBSD.org>
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;
 }
 
 /*