From nobody Mon Jun 05 08:36:11 2023 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 4QZRlc1ntPz4bMBN; Mon, 5 Jun 2023 08:36:12 +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 4QZRlb72t0z3xXj; Mon, 5 Jun 2023 08:36:11 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1685954172; 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=nNvJQBGlmRU2rKeF6UugbxPPURnV+GyVgzwO3arF9h0=; b=wDCm3ohSbKOEfxQH3c+1db1VK2enPFdBorVg/Gzh2zQ9b9rNlRS4xVleofTs9WuMUlxjAr NzCuXkZmTNjMOWiLT5VA3eXgO5EVw6JK18ylMlzyFsECDkrE0H8OcNrF+PO1N6F2DUZxEF Hlr6C46kS5mF92NnxtLa7DlpJg40eZp8sYZoRyAt3EAjXg80jL/40dpJwifSU0SgNdGXe6 mkzYICf9An1ekLUKpiTlvk/3k0Z1thIQ04Dw+NTTTrT4hQhys7EJI+Bj6TkD5h6jH2AQZ2 n7ZDHGE9GRD2tM5fmrfE88kYlQ/gYaqfQ5Pq/O8cTYEx6Cv6/g4CU4wihdUkwQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1685954172; 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=nNvJQBGlmRU2rKeF6UugbxPPURnV+GyVgzwO3arF9h0=; b=rr0rRU2JuRhsaY3EMBmZUziVunQ3BWAbcm7xddfCGPuRi8L0dFMlhMlzVgRsROEkcdHZaE KvmiHLCM5kVgYSV2m7mxmtY0yr4SQbYDUJRDKT/nhYqajiiGr7Z9hPeepuWpMiuu9ib+eh fhLK73svEuRaFkuRbZMNMYCrktI0igYoMJIpmNG58uuaQ4pbjOtqprDKlr14y4Au3zrw2m mlMC1GQWkJzCLa3p9im7ccuJHhsa/axy8ya1gIhO1FvUGLGMW8vcHj5JGX2CChOiZP2naN bRPQaoKVd5T9p2spIlqENOPaPnfN1b5dgLDc2KCJWOZ+1hkd7qpl0kY5us31Kg== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1685954172; a=rsa-sha256; cv=none; b=cM7aHZ2ivXI0eCbc1WbikbVakGe37koD7f33nv/ArgWO+OOSgfmJp9qeEW0anp70Wzuvw7 +eGqQqMXUQynOLjhp3bFClqNzsmAXqez3hOZtlBEgV73lw7Ym7wqg12xwP3mZvrQ41v80U EPdeo8NbDSHT5QcTGGOGFdGjPYmpKPcNuzQuRi94pve457PTJX4i/tioOWpdkQ5TPpXsD7 oJ31UwA8j7XOiB8fiGFjPcTSNfeA8Jav2K/aT+pIk+VL5f/bopzfip6ysEDZts8tuq2h+w Cky9K9R6n+Nwy96Nd8/hgkWoSA3HG7VxUF43xsmjWohSyqyHXx0z/vwMBUfl0g== 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 4QZRlb68zLzgMQ; Mon, 5 Jun 2023 08:36:11 +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 3558aBTk024542; Mon, 5 Jun 2023 08:36:11 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.16.1/8.16.1/Submit) id 3558aB6n024541; Mon, 5 Jun 2023 08:36:11 GMT (envelope-from git) Date: Mon, 5 Jun 2023 08:36:11 GMT Message-Id: <202306050836.3558aB6n024541@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org From: Konstantin Belousov Subject: git: bb75966eaa31 - stable/13 - reapkill: handle possible pid reuse after the pid was recorded as signalled 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: Sender: owner-dev-commits-src-branches@freebsd.org X-BeenThere: dev-commits-src-branches@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/stable/13 X-Git-Reftype: branch X-Git-Commit: bb75966eaa3125aa22884663768068a173cda408 Auto-Submitted: auto-generated X-ThisMailContainsUnwantedMimeParts: N The branch stable/13 has been updated by kib: URL: https://cgit.FreeBSD.org/src/commit/?id=bb75966eaa3125aa22884663768068a173cda408 commit bb75966eaa3125aa22884663768068a173cda408 Author: Konstantin Belousov AuthorDate: 2023-05-12 22:36:52 +0000 Commit: Konstantin Belousov CommitDate: 2023-06-05 08:35:01 +0000 reapkill: handle possible pid reuse after the pid was recorded as signalled (cherry picked from commit 8164032a495b53b9176814f7b08e093961fabdca) --- sys/kern/kern_procctl.c | 36 +++++++++++++++++++++++++++++++++++- sys/sys/proc.h | 1 + 2 files changed, 36 insertions(+), 1 deletion(-) diff --git a/sys/kern/kern_procctl.c b/sys/kern/kern_procctl.c index a4f675c2938e..16bd9ac702e8 100644 --- a/sys/kern/kern_procctl.c +++ b/sys/kern/kern_procctl.c @@ -416,8 +416,22 @@ reap_kill_subtree_once(struct thread *td, struct proc *p, struct proc *reaper, continue; if ((p2->p_treeflag & P_TREE_REAPER) != 0) reap_kill_sched(&tracker, p2); - if (alloc_unr_specific(pids, p2->p_pid) != p2->p_pid) + + /* + * Handle possible pid reuse. If we recorded + * p2 as killed but its p_flag2 does not + * confirm it, that means that the process + * terminated and its id was reused by other + * process in the reaper subtree. + * + * Unlocked read of p2->p_flag2 is fine, it is + * our thread that set the tested flag. + */ + if (alloc_unr_specific(pids, p2->p_pid) != p2->p_pid && + (atomic_load_int(&p2->p_flag2) & + (P2_REAPKILLED | P2_WEXIT)) != 0) continue; + if (p2 == td->td_proc) { if ((p2->p_flag & P_HADTHREADS) != 0 && (p2->p_flag2 & P2_WEXIT) == 0) { @@ -428,6 +442,11 @@ reap_kill_subtree_once(struct thread *td, struct proc *p, struct proc *reaper, st = false; } PROC_LOCK(p2); + /* + * sapblk ensures that only one thread + * in the system sets this flag. + */ + p2->p_flag2 |= P2_REAPKILLED; if (st) r = thread_single(p2, SINGLE_NO_EXIT); (void)pksignal(p2, w->rk->rk_sig, w->ksi); @@ -445,6 +464,7 @@ reap_kill_subtree_once(struct thread *td, struct proc *p, struct proc *reaper, PROC_LOCK(p2); if ((p2->p_flag2 & P2_WEXIT) == 0) { _PHOLD_LITE(p2); + p2->p_flag2 |= P2_REAPKILLED; PROC_UNLOCK(p2); w->target = p2; taskqueue_enqueue(taskqueue_thread, @@ -471,6 +491,9 @@ reap_kill_subtree(struct thread *td, struct proc *p, struct proc *reaper, struct reap_kill_proc_work *w) { struct unrhdr pids; + void *ihandle; + struct proc *p2; + int pid; /* * pids records processes which were already signalled, to @@ -486,6 +509,17 @@ reap_kill_subtree(struct thread *td, struct proc *p, struct proc *reaper, PROC_UNLOCK(td->td_proc); while (reap_kill_subtree_once(td, p, reaper, &pids, w)) ; + + ihandle = create_iter_unr(&pids); + while ((pid = next_iter_unr(ihandle)) != -1) { + p2 = pfind(pid); + if (p2 != NULL) { + p2->p_flag2 &= ~P2_REAPKILLED; + PROC_UNLOCK(p2); + } + } + free_iter_unr(ihandle); + out: clean_unrhdr(&pids); clear_unrhdr(&pids); diff --git a/sys/sys/proc.h b/sys/sys/proc.h index 0f04921fffe6..997ff110bcdc 100644 --- a/sys/sys/proc.h +++ b/sys/sys/proc.h @@ -836,6 +836,7 @@ struct proc { #define P2_WEXIT 0x00040000 /* exit just started, no external thread_single() is permitted */ +#define P2_REAPKILLED 0x00080000 /* Flags protected by proctree_lock, kept in p_treeflags. */ #define P_TREE_ORPHANED 0x00000001 /* Reparented, on orphan list */