From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-dl1-f74.google.com (mail-dl1-f74.google.com [74.125.82.74]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id ECFDF34D4DE for ; Mon, 1 Jun 2026 06:15:01 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.82.74 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780294504; cv=none; b=c5FdgxkOaTGeUxQPt9aJgk4WEdq0E1wY5m3YPHaKmxTqrjfKkvTadnRvtXK5WG1n+xPWcVasewaL8fIkqvW0Ka62TzkFclK/PCNrJCpheUgyv/FRNNOEaldnbFYr2EtBwsIpPzdXw9F3IEU04+Qi8tqJNFr778yhUCNx/VJlMrM= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780294504; c=relaxed/simple; bh=7n0GOpFdK0D9/T2ts6a0KLwCVVtFYd1C2oZi1sY0al0=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=eQWQ6nrBNYOesrrPcyFzgvBA5Cgpj72eV9xKrLiO7BgNsEws4tMysudYrYdPWywsB/DvrlqImlBu2HMrdLeWqpRn7vtzVXcd0+DDZUOvr8Kw7k9nHvE2eyKNybR88X56/j40tDeA8rO2pZpkdvCe9+RPyyZphF3lYXY0MV1N3V8= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--irogers.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=OagFg4NN; arc=none smtp.client-ip=74.125.82.74 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--irogers.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="OagFg4NN" Received: by mail-dl1-f74.google.com with SMTP id a92af1059eb24-1370417c0bfso5260214c88.0 for ; Sun, 31 May 2026 23:15:01 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1780294501; x=1780899301; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=I451DX2U3uFjvueSGTTz18fbr5Eyooiuku7kTqgCnjM=; b=OagFg4NNKI3Fosr6fr6agxcOG4G8a300jSGkO9CBIFnM81ftz1M0iXnPTgqJA4fYbK 8gk/QtxAK6cR+KdYpBIMqVLPeE0fKGmh3lLqMJVN65Pkl/V0j7/ns+pxYk9ZF9PmZKj/ o3TirkoKNFIVt4KadlMhBy8kZzdTG46ExWyzR4SQ5auvJELW2jGJSJm4qwfY5C3Kd3NR ZVgxnde/YGjXIy9Vws146Tl180MQzbB+xgz6BkUxvy0dD6JwEEzDd+crZHMpEaTGrSQo F5o08J3YrS6ILNTNe4hYaGIypBMe3OlEwB4UIKWzHCPnwpOTZQ5U3tv/nbBR6aT/ncWF CvfQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1780294501; x=1780899301; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=I451DX2U3uFjvueSGTTz18fbr5Eyooiuku7kTqgCnjM=; b=jw0IIRlOlYUbS57pGbuJ5N9mq92a2q8k4wOGcttDo+k/WrbtprAubVTqGrP3dz3Ujx Zp53WvagriLDPc8ZXiY6Rdn+dHofFsWgaArzsE85ShHrLDf/9M8tLgM8iMt6irTRlAgt 9zQe7rYaqBJ4z9WmMROQQeT4/bZaql24wmVs/GAFFAoz9Jb9bXIy3uBzVvKs5OM73KCM pV8J49Xu6ktcKIkEHXYZ4ypQiAQvXGd+snhlGSEo6drllkMxyuQgLmqhOdpfsIHXTeof TprDSEue8raRAM7CspMjeplrymurrsPLJTPmd4ZFihoVR7+FyyebNJX8G8P1L/wEA/Ux kezA== X-Forwarded-Encrypted: i=1; AFNElJ+d4g9OqxYj8JEv6vGFXGepvQnQBoAAuEKuxcTMmkvOUNpMzexgVJ8+OAUQIrj+skG5qNqbVRjemYUhcYk=@vger.kernel.org X-Gm-Message-State: AOJu0YyV9onkLB3ha0DoWBrKOhbCWMPDwmgeBlZ8UKpaf/jsfW7Tn8GK ny8nzbSTzwvWiikU3a9um08vh2les4IDfAdF/A5N7ZZKYekP8ngaWx9L+0OUcAytYS+0ZfeWsn2 Oojw6l72aPQ== X-Received: from dlbsj5.prod.google.com ([2002:a05:7022:f905:b0:134:b02e:a831]) (user=irogers job=prod-delivery.src-stubby-dispatcher) by 2002:a05:7022:217:b0:136:aebc:24f5 with SMTP id a92af1059eb24-137d4435cddmr3481044c88.15.1780294500509; Sun, 31 May 2026 23:15:00 -0700 (PDT) Date: Sun, 31 May 2026 23:13:52 -0700 In-Reply-To: <20260601061401.1541457-1-irogers@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260601000548.1195604-1-irogers@google.com> <20260601061401.1541457-1-irogers@google.com> X-Mailer: git-send-email 2.54.0.823.g6e5bcc1fc9-goog Message-ID: <20260601061401.1541457-7-irogers@google.com> Subject: [PATCH 06/15] tools subcmd: Robust fallback and existence checks for process reaping From: Ian Rogers To: irogers@google.com, acme@kernel.org, adrian.hunter@intel.com, namhyung@kernel.org Cc: alexander.shishkin@linux.intel.com, james.clark@linaro.org, jolsa@kernel.org, linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org, mingo@redhat.com, peterz@infradead.org Content-Type: text/plain; charset="UTF-8" Update check_if_command_finished() to check if cmd->pid <= 0 to avoid reaping process hazards when PID has been set to -1 on startup error. Transition the procfs status fopen() fallback from active waitpid() calls to robust kill(pid, 0) existence and ESRCH detection logic. This allows zombie processes to remain until explicitly reaped by finish_command(), eradicating the risk of infinite loops induced by kernel PID reuse across unrelated system daemons. Assisted-by: Gemini-CLI:Google Gemini 3 Signed-off-by: Ian Rogers --- tools/lib/subcmd/run-command.c | 51 ++++++++++++++++++++++++++++++++-- 1 file changed, 49 insertions(+), 2 deletions(-) diff --git a/tools/lib/subcmd/run-command.c b/tools/lib/subcmd/run-command.c index b7510f83209a..5ae7b9fa4dab 100644 --- a/tools/lib/subcmd/run-command.c +++ b/tools/lib/subcmd/run-command.c @@ -233,7 +233,14 @@ int check_if_command_finished(struct child_process *cmd) char filename[6 + MAX_STRLEN_TYPE(typeof(cmd->pid)) + 7 + 1]; char status_line[256]; FILE *status_file; +#endif + + if (cmd->finished) + return 1; + if (cmd->pid <= 0) + return 1; +#ifdef __linux__ /* * Check by reading /proc//status as calling waitpid causes * stdout/stderr to be closed and data lost. @@ -241,8 +248,48 @@ int check_if_command_finished(struct child_process *cmd) sprintf(filename, "/proc/%u/status", cmd->pid); status_file = fopen(filename, "r"); if (status_file == NULL) { - /* Open failed assume finish_command was called. */ - return true; + int status; + pid_t waiting; + + /* + * fopen() can fail with ENOENT if the process has been reaped. + * It can also fail with EMFILE/ENFILE if RLIMIT_NOFILE is reached. + * In those cases, use waitpid(..., WNOHANG) to robustly check + * and reap the process if it has exited. + */ + if (errno == ENOENT) + return 1; + + waiting = waitpid(cmd->pid, &status, WNOHANG); + if (waiting == cmd->pid) { + int result; + int code; + + cmd->finished = 1; + if (WIFSIGNALED(status)) { + result = -ERR_RUN_COMMAND_WAITPID_SIGNAL; + } else if (!WIFEXITED(status)) { + result = -ERR_RUN_COMMAND_WAITPID_NOEXIT; + } else { + code = WEXITSTATUS(status); + switch (code) { + case 127: + result = -ERR_RUN_COMMAND_EXEC; + break; + case 0: + result = 0; + break; + default: + result = -code; + break; + } + } + cmd->finish_result = result; + return 1; + } + if (waiting < 0 && (errno == ECHILD || errno == ESRCH)) + return 1; + return 0; } while (fgets(status_line, sizeof(status_line), status_file) != NULL) { char *p; -- 2.54.0.823.g6e5bcc1fc9-goog