From nobody Mon Jun 13 19:33:41 2022 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 A1848855076; Mon, 13 Jun 2022 19:33:42 +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 "R3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4LMMF22XQ5z3q2c; Mon, 13 Jun 2022 19:33:42 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1655148822; 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=2Q0bGyFHROY7ShS6K8Tz5sMPJi/dz8E1kNh+Wr29Ut8=; b=dY3h8sG4+9x67OVQ6h3JJo8jbqKf7efhSaewd9qg4lBTqdHORULieqEcMM+VhLv9gAnh4v TE1RS9sCmf8f+XmfhpDEMVcaR7sczPJJCeqNlNQSTr0pRfXLNCEbRSY9AtVqhsaUZwCtW7 yTZr7vNSc+8O9Yro8MH381/frmupcTyOaV3bW7Dlb/cegRMwm8YeWT6yMcX7nL19aUeMrX 8HSEt0jZaoPYGIrB0Au1BDtwVW9LoTzxOtFPbr4U20M1CaMydY7CO8XkHpo0nkKk/Uahih BL89uOWz0chXzVlzFmC+8e+VJVkOlTFJf5crv0LqTNqt+Gk0qufPztnNTz+iXQ== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) (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 did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id F10701BA64; Mon, 13 Jun 2022 19:33:41 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.16.1/8.16.1) with ESMTP id 25DJXf13023814; Mon, 13 Jun 2022 19:33:41 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.16.1/8.16.1/Submit) id 25DJXfrC023813; Mon, 13 Jun 2022 19:33:41 GMT (envelope-from git) Date: Mon, 13 Jun 2022 19:33:41 GMT Message-Id: <202206131933.25DJXfrC023813@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Konstantin Belousov Subject: git: e0343eacf365 - main - reap_kill_subtree(): hold the reaper when entering it into the queue to handle later 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: Sender: owner-dev-commits-src-main@freebsd.org X-BeenThere: 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: e0343eacf36588bf503c7a59c0cc436294223839 Auto-Submitted: auto-generated ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1655148822; 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=2Q0bGyFHROY7ShS6K8Tz5sMPJi/dz8E1kNh+Wr29Ut8=; b=ZEGMursFxHWAw/X0a7t5GEuWEFtwAjXWDnoG6E/AwVWUVaVdCIVJi+7ewlIRgkvfU8PBl3 orGB2MyvshbQV4pUBWNhmm/x77oTYYbLvxvYo4H8K2cd6vdIIP7IeNXwuvppyECgCbAm5O EGGNPtuyfBS7HJowvxQIKrIfrmQzWGAzJsm+QY3izymUG56wnQdzuNOfLl9vN4xVYY/s0B Hp8V8eKYf0IwHDLypFzEc6UDWtekkKD8Cg4d4mvcOIWQhGTguCejLyD4AMr96/JP5xAppr gvHCVLtIQWw77bXe9lQV3Jnr6CXZ+Eg6jdUU7e9xCX24EbcB7zbp1Sk/atUXgA== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1655148822; a=rsa-sha256; cv=none; b=DEg9Iwadtk0ENYsmmZs/dggLPNYPwF3Ge0iLt4o1wwHbXIpNtNjaA95yTg/prMfm5Kt4mY e8ZlVDe7YPALZMAXzRggBijuTkWyy1dWPv6C3jr6pxYO3B4v9dgsW4H3Mre3w9RRT/9Aoc CYuv4Y8CABemMqwhR5GNx5Ji0+IqgAiAgKI9UhcLZ7fISx5eRArtq7KaDIBcMsdM3JI7AS jmnDrzq2CBsPDZdo/h0xLniaaNyZQ2Aq+qrU7TiyH6GPghOlV0NSOc0U6khFofcb0YEPlA ZlwUeo3heplB3treGjoGFu7mqFomu1jogp9Lo2SM3M8OkDB/dbMj5DrcQIP2dg== ARC-Authentication-Results: i=1; mx1.freebsd.org; none X-ThisMailContainsUnwantedMimeParts: N The branch main has been updated by kib: URL: https://cgit.FreeBSD.org/src/commit/?id=e0343eacf36588bf503c7a59c0cc436294223839 commit e0343eacf36588bf503c7a59c0cc436294223839 Author: Konstantin Belousov AuthorDate: 2022-05-15 22:52:09 +0000 Commit: Konstantin Belousov CommitDate: 2022-06-13 19:30:03 +0000 reap_kill_subtree(): hold the reaper when entering it into the queue to handle later We drop proctree_lock, which allows the process to exit while memoized in the list to proceed. Reported and tested by: pho Reviewed by: markj Sponsored by: The FreeBSD Foundation MFC after: 2 weeks Differential revision: https://reviews.freebsd.org/D35310 --- sys/kern/kern_procctl.c | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/sys/kern/kern_procctl.c b/sys/kern/kern_procctl.c index 02469f25bc3d..b32a4156dafb 100644 --- a/sys/kern/kern_procctl.c +++ b/sys/kern/kern_procctl.c @@ -336,11 +336,25 @@ reap_kill_sched(struct reap_kill_tracker_head *tracker, struct proc *p2) { struct reap_kill_tracker *t; + PROC_LOCK(p2); + if ((p2->p_flag2 & P2_WEXIT) != 0) { + PROC_UNLOCK(p2); + return; + } + _PHOLD_LITE(p2); + PROC_UNLOCK(p2); t = malloc(sizeof(struct reap_kill_tracker), M_TEMP, M_WAITOK); t->parent = p2; TAILQ_INSERT_TAIL(tracker, t, link); } +static void +reap_kill_sched_free(struct reap_kill_tracker *t) +{ + PRELE(t->parent); + free(t, M_TEMP); +} + static void reap_kill_children(struct thread *td, struct proc *reaper, struct procctl_reaper_kill *rk, ksiginfo_t *ksi, int *error) @@ -379,7 +393,7 @@ reap_kill_subtree_once(struct thread *td, struct proc *p, struct proc *reaper, * reaper, which should handle it. */ if ((t->parent->p_treeflag & P_TREE_REAPER) == 0) { - free(t, M_TEMP); + reap_kill_sched_free(t); res = true; continue; } @@ -396,7 +410,7 @@ reap_kill_subtree_once(struct thread *td, struct proc *p, struct proc *reaper, reap_kill_proc(td, p2, ksi, rk, error); res = true; } - free(t, M_TEMP); + reap_kill_sched_free(t); } return (res); }