From nobody Sun Aug 16 02:46:34 2026 X-Original-To: dev-commits-src-branches@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 4hN0j70NpWz6pGsX for ; Sun, 16 Aug 2026 02:46:35 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "YR2" (not verified)) by mx1.freebsd.org (Postfix) with ESMTPS id 4hN0j65cF8z3dch for ; Sun, 16 Aug 2026 02:46:34 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1786848394; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=+2rRnYVxEBWaMlBqCjcEEVWpAYPi3N/OXQdgEq+cixc=; b=AI9tyXfa2uDrdqghXDcU6MicqfYsuXQ9PSQxSMfQCr/Yi5xucltbxyfiDj3nfz+78oqFqr fwNGJuV3RjpyDkVDFkSkRsM28suji/QWLtgbEr7hfMGkGaRnExJjujccWQIqBqHJM0/EGn AMAwxUNJ1BFmMmkznd2vKWUr/jeiUbbSo0S7kGXYzp17OFYwgoAGdTwInP1MG6uY0VGjZT 8K2HLxcCWIIao9wDNxH+p56r4N4TvaTmNf4WgQYyKTNkGL8yQNjIkHhOyss3ohXKq9GBeo 5vZJ7KGrP39j3b7S8pdRKK6+U8t0lklDzumhTsOZjZZyQbdaY+s4v82ad6Liig== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1786848394; a=rsa-sha256; cv=none; b=XwxBnnmgMCGaLkKj42w05XRk6Y+znoIhZiv4BF2mkJ/r6jkENn5Q5Et3urthIfiJL59hyL zFXuZ58SDZhBz6aSxoNeXvuZ0S10/2mE6UdK6pp0YL4vjHiMJkxUO+yt1mXmdjHmo0GsgG t9S672FCR0uvpqZ5tL4KDybVMhmsxV9bgWOSQ3yEzIPs9yvQPe09zT30bgyEHtmkyWcIWf tXMlh3j/jRsWtTlElp2Aa63Uw/H7NkTY63vJbmVSAl1aQlI000hkG8Lm1ZM1/WfvLyiRzj /ExouHLG6Uert33kyos3+K2MudYnD6tXcnbh6Y+EjTatCdgip/qVxwN9sQ+nNw== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1786848394; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=+2rRnYVxEBWaMlBqCjcEEVWpAYPi3N/OXQdgEq+cixc=; b=yTm21OhLZloMVaRX93QdN6vBLW9tY6kyhsQxaxNjqy2vIZ9kX2/jkhKiQDn4kw+I0jPUZR TAWrQEGtCozhs2nsz1qSi/RygLL8khm9Z3kJLSd8KX7OPs4dGTkQXupM9qKf87zzMa4tfe Su6tPpbFLdF2yevUX3DLEGydtqXcxONPkRm0crWOr4PQvBvKf8MwoNOtWmgPg9LNLWGcNf 87amYUjWgjO75FroD7CN2gPhkAtcKnFvVaUHBJk46LQad4kVRJVId7uAC9WZfUWkfIJgyK XiPjvxzGfDp2EWY/dAOjzYzaQCbBZFXn2/k9MwBtJfOYWWR4YzeVXQb0OZCReQ== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) by mxrelay.nyi.freebsd.org (Postfix) with ESMTP id 4hN0j644pzz188m for ; Sun, 16 Aug 2026 02:46:34 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from git (uid 1279) (envelope-from git@FreeBSD.org) id 447af by gitrepo.freebsd.org (DragonFly Mail Agent v0.13+ on gitrepo.freebsd.org); Sun, 16 Aug 2026 02:46:34 +0000 To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org From: Konstantin Belousov Subject: git: cd349e1bcd21 - stable/15 - procdesc: track count of open files List-Id: Commits to the stable branches of the FreeBSD src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-branches List-Help: List-Post: List-Subscribe: List-Unsubscribe: X-BeenThere: dev-commits-src-branches@freebsd.org Sender: owner-dev-commits-src-branches@FreeBSD.org List-Id: List-Post: List-Help: List-Subscribe: List-Unsubscribe: List-Owner: Precedence: list MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: kib X-Git-Repository: src X-Git-Refname: refs/heads/stable/15 X-Git-Reftype: branch X-Git-Commit: cd349e1bcd21bbf9fd8834550cb6b8305977472c Auto-Submitted: auto-generated Date: Sun, 16 Aug 2026 02:46:34 +0000 Message-Id: <6a81248a.447af.47045d46@gitrepo.freebsd.org> The branch stable/15 has been updated by kib: URL: https://cgit.FreeBSD.org/src/commit/?id=cd349e1bcd21bbf9fd8834550cb6b8305977472c commit cd349e1bcd21bbf9fd8834550cb6b8305977472c Author: Konstantin Belousov AuthorDate: 2026-05-21 00:47:20 +0000 Commit: Konstantin Belousov CommitDate: 2026-08-16 02:41:21 +0000 procdesc: track count of open files (cherry picked from commit 18b6bb5231bf1c927a6f8de24e466764fe1f7470) --- sys/kern/kern_exit.c | 4 ++-- sys/kern/sys_procdesc.c | 17 +++++++++++------ sys/sys/procdesc.h | 4 +++- 3 files changed, 16 insertions(+), 9 deletions(-) diff --git a/sys/kern/kern_exit.c b/sys/kern/kern_exit.c index b20009f46139..73c5a6f9f224 100644 --- a/sys/kern/kern_exit.c +++ b/sys/kern/kern_exit.c @@ -1577,8 +1577,8 @@ kern_pdwait(struct thread *td, int fd, int *status, for (;;) { /* We own a reference on the procdesc file. */ - KASSERT((pd->pd_flags & PDF_CLOSED) == 0, - ("PDF_CLOSED proc %p procdesc %p pd flags %#x", + KASSERT(pd->pd_fpcount > 0, + ("closed proc %p procdesc %p pd flags %#x", p, pd, pd->pd_flags)); sx_xlock(&proctree_lock); diff --git a/sys/kern/sys_procdesc.c b/sys/kern/sys_procdesc.c index 3c99f0241016..a3e234be7e39 100644 --- a/sys/kern/sys_procdesc.c +++ b/sys/kern/sys_procdesc.c @@ -219,6 +219,7 @@ procdesc_alloc(int flags) * struct file, and the other from their struct proc. */ refcount_init(&pd->pd_refcount, 2); + pd->pd_fpcount = 1; return (pd); } @@ -293,8 +294,8 @@ procdesc_free(struct procdesc *pd) if (refcount_release(&pd->pd_refcount)) { KASSERT(pd->pd_proc == NULL, ("procdesc_free: pd_proc != NULL")); - KASSERT((pd->pd_flags & PDF_CLOSED), - ("procdesc_free: !PDF_CLOSED")); + KASSERT(pd->pd_fpcount == 0, + ("procdesc_free: not closed %p %d", pd, pd->pd_fpcount)); if (pd->pd_pid != -1) proc_id_clear(PROC_ID_PID, pd->pd_pid); @@ -322,7 +323,7 @@ procdesc_exit(struct proc *p) pd = p->p_procdesc; PROCDESC_LOCK(pd); - KASSERT((pd->pd_flags & PDF_CLOSED) == 0 || p->p_pptr == p->p_reaper, + KASSERT(pd->pd_fpcount > 0 || p->p_pptr == p->p_reaper, ("procdesc_exit: closed && parent not reaper")); pd->pd_flags |= PDF_EXITED; @@ -334,7 +335,7 @@ procdesc_exit(struct proc *p) * Clean up the procdesc now rather than letting it happen during * that reap. */ - if (pd->pd_flags & PDF_CLOSED) { + if (pd->pd_fpcount == 0) { PROCDESC_UNLOCK(pd); pd->pd_proc = NULL; p->p_procdesc = NULL; @@ -388,7 +389,8 @@ procdesc_close(struct file *fp, struct thread *td) sx_xlock(&proctree_lock); PROCDESC_LOCK(pd); - pd->pd_flags |= PDF_CLOSED; + MPASS(pd->pd_fpcount > 0); + pd->pd_fpcount--; PROCDESC_UNLOCK(pd); p = pd->pd_proc; if (p == NULL) { @@ -408,7 +410,7 @@ procdesc_close(struct file *fp, struct thread *td) * calls back into procdesc_reap(). */ proc_reap(curthread, p, NULL, 0); - } else { + } else if (pd->pd_fpcount == 0) /* last procdesc */ { /* * If the process is not yet dead, we need to kill it, * but we can't wait around synchronously for it to go @@ -438,6 +440,9 @@ procdesc_close(struct file *fp, struct thread *td) kern_psignal(p, SIGKILL); PROC_UNLOCK(p); sx_xunlock(&proctree_lock); + } else { + PROC_UNLOCK(p); + sx_xunlock(&proctree_lock); } } diff --git a/sys/sys/procdesc.h b/sys/sys/procdesc.h index a6be5dbe576c..08b563828b95 100644 --- a/sys/sys/procdesc.h +++ b/sys/sys/procdesc.h @@ -51,6 +51,8 @@ * (r) - Atomic reference count. * (s) - Protected by selinfo. * (t) - Protected by the proctree_lock + * (p|t) - Both procree_lock and process descriptor must be locked + * for pd_fpcount */ struct proc; struct sigio; @@ -63,6 +65,7 @@ struct procdesc { struct proc *pd_proc; /* (t) Process. */ pid_t pd_pid; /* (c) Cached pid. */ u_int pd_refcount; /* (r) Reference count. */ + u_int pd_fpcount; /* (p|t) files referencing me */ /* * In-flight data and notification of events. @@ -85,7 +88,6 @@ struct procdesc { /* * Flags for the pd_flags field. */ -#define PDF_CLOSED 0x00000001 /* Descriptor has closed. */ #define PDF_EXITED 0x00000004 /* Process exited. */ #define PDF_DAEMON 0x00000008 /* Don't exit when procdesc closes. */