From nobody Sat Feb 21 10:07:57 2026 X-Original-To: dev-commits-src-main@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 4fJ2qd6GkZz6SMC6 for ; Sat, 21 Feb 2026 10:07:57 +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 "R12" (not verified)) by mx1.freebsd.org (Postfix) with ESMTPS id 4fJ2qd3vVGz464r for ; Sat, 21 Feb 2026 10:07:57 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1771668477; 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=nY3nooff7E0G8adGASd2J1aKb/+KjhXrO41DN5dsWOM=; b=kqkkAz/BHm4UDi0R4+eaj0SZbu1lXG97PuWDdFNa92je++2B37HL5xrMhee1k5cHhCdMu2 UKnudWcyUc3j6ka1liM2IiHw9iBJhjtebAdXmAaNcDXx23EiV8Wz/Rz2QltvMeuRNzuVEP HRPBa4tLQrgHcdjfehTzxIbMmI8vMlY93yvZoydq8p/EqxV6Q0TiB/8S/OosH9PHSAkVu4 jChLVWAstj4s1d9XvOF7U3EuA9g7y0fgFKpc3NQfAW/YTEWli268yk+fsaiVWS5JU7rjPi 6TYlggA5jiCOieJDB7X6clZ+d3kKTUELQkWsiF5SRjT3ar3WYtE6KL0wFs+S0A== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1771668477; a=rsa-sha256; cv=none; b=Dkc/kvmNCTFQUNKbvimGIEVoSFNyk8zjOHuTHfKPel7lBn0dEVjwcU+b7FnZdV5spmGXKf XQmc5Jt5ITxhRgTdJOjuYbSPazSjyhA1RCWV1loewZs1Q8b4bk+iqAoAlzV2qQnuFm7bp8 KBo+V53M0dRvHomMJoAOjlQdaO+9Q/zYBaHe5B2qUycLKj/NNUUbCncSO7VjJH+aK4gnLV TiaQjS4ZVtqAylTg9TSMRn6znUYGvuE6pdgHdf4i5bfYl9DjqYS9AYpAe4cXvGXjylowV2 CcKTiSPi+tnRQdFasmhjOVLkl0CjXC/OwgeqChSlThobrKPOJMsxiqHhaSwIWw== 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=1771668477; 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=nY3nooff7E0G8adGASd2J1aKb/+KjhXrO41DN5dsWOM=; b=hYa/aPla9LW7lnKKY6gy7Wu8XQoir1nCvD3T06t0EoSWdRyNUvmS0EoQHGewFbPTmQAg0g Exz7Z2mQb6QtZE+Ha6Qo351PUM9WTtKDBZnEesYq4onPKAoPb6b4jjn5XNE6Khn1cTd7cO g1MiGaD//BS9OKcbRlWUDXl+RjYLS9LdaI/YXHtqTdVwYXqd6tP3SIT4OWIInhvomc68tw njOrfoylH1QqnFiilviRBwTzsNJSM/oHDQmlAviOxnDvkk1XV68gfxBQ3ORFoeMEvt1OKa ZVlCmKR9b+rGznBD7twoHxl014goweny3c8XTY6X2iN4OeTquCztePQI73PzBg== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) by mxrelay.nyi.freebsd.org (Postfix) with ESMTP id 4fJ2qd3TBHz181t for ; Sat, 21 Feb 2026 10:07:57 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from git (uid 1279) (envelope-from git@FreeBSD.org) id 2076b by gitrepo.freebsd.org (DragonFly Mail Agent v0.13+ on gitrepo.freebsd.org); Sat, 21 Feb 2026 10:07:57 +0000 To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Konstantin Belousov Subject: git: 0e67c3f675ea - main - reap_kill_subtree_once(): reap_kill_proc_work() might drop proctree_lock List-Id: Commit messages for the main branch of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-main List-Help: List-Post: List-Subscribe: List-Unsubscribe: X-BeenThere: dev-commits-src-main@freebsd.org Sender: owner-dev-commits-src-main@FreeBSD.org 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/main X-Git-Reftype: branch X-Git-Commit: 0e67c3f675eab3a9c00b76e3886ace7700ef1bd4 Auto-Submitted: auto-generated Date: Sat, 21 Feb 2026 10:07:57 +0000 Message-Id: <699983fd.2076b.528797b0@gitrepo.freebsd.org> The branch main has been updated by kib: URL: https://cgit.FreeBSD.org/src/commit/?id=0e67c3f675eab3a9c00b76e3886ace7700ef1bd4 commit 0e67c3f675eab3a9c00b76e3886ace7700ef1bd4 Author: Konstantin Belousov AuthorDate: 2026-02-16 15:20:02 +0000 Commit: Konstantin Belousov CommitDate: 2026-02-21 09:45:47 +0000 reap_kill_subtree_once(): reap_kill_proc_work() might drop proctree_lock Due to this, restart the iteration over the p_reapsiblings if the lock was dropped. Reviewed by: markj Tested by: pho Sponsored by: The FreeBSD Foundation MFC after: 1 week Differential revision: https://reviews.freebsd.org/D55288 --- sys/kern/kern_procctl.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/sys/kern/kern_procctl.c b/sys/kern/kern_procctl.c index 04c47d086677..30ab37d56877 100644 --- a/sys/kern/kern_procctl.c +++ b/sys/kern/kern_procctl.c @@ -280,7 +280,7 @@ reap_kill_proc_locked(struct reap_kill_proc_work *w) } static void -reap_kill_proc(struct reap_kill_proc_work *w) +reap_kill_proc(struct reap_kill_proc_work *w, bool *proctree_dropped) { struct pgrp *pgrp; int xlocked; @@ -311,6 +311,7 @@ reap_kill_proc(struct reap_kill_proc_work *w) /* This is safe because pgrp zone is nofree. */ sx_xlock(&pgrp->pg_killsx); sx_xunlock(&pgrp->pg_killsx); + *proctree_dropped = true; if (xlocked) sx_xlock(&proctree_lock); else @@ -392,7 +393,7 @@ reap_kill_subtree_once(struct thread *td, struct proc *p, struct proc *reaper, struct reap_kill_tracker_head tracker; struct reap_kill_tracker *t; struct proc *p2; - bool res; + bool proctree_dropped, res; res = false; TAILQ_INIT(&tracker); @@ -400,6 +401,7 @@ reap_kill_subtree_once(struct thread *td, struct proc *p, struct proc *reaper, while ((t = TAILQ_FIRST(&tracker)) != NULL) { TAILQ_REMOVE(&tracker, t, link); +again: /* * Since reap_kill_proc() drops proctree_lock sx, it * is possible that the tracked reaper is no longer. @@ -435,6 +437,7 @@ reap_kill_subtree_once(struct thread *td, struct proc *p, struct proc *reaper, (P2_REAPKILLED | P2_WEXIT)) != 0) continue; + proctree_dropped = false; PROC_LOCK(p2); if ((p2->p_flag2 & P2_WEXIT) == 0) { _PHOLD(p2); @@ -446,11 +449,13 @@ reap_kill_subtree_once(struct thread *td, struct proc *p, struct proc *reaper, p2->p_flag2 |= P2_REAPKILLED; w->target = p2; - reap_kill_proc(w); + reap_kill_proc(w, &proctree_dropped); _PRELE(p2); } PROC_UNLOCK(p2); res = true; + if (proctree_dropped) + goto again; } reap_kill_sched_free(t); }