Linux Perf Users
 help / color / mirror / Atom feed
From: sashiko-bot@kernel.org
To: "Ian Rogers" <irogers@google.com>
Cc: linux-perf-users@vger.kernel.org
Subject: Re: [PATCH v7] perf test: Refactor parallel poll loop to drain all pipes simultaneously
Date: Tue, 02 Jun 2026 07:47:52 +0000	[thread overview]
Message-ID: <20260602074753.59A441F00893@smtp.kernel.org> (raw)
In-Reply-To: <20260602073132.2653307-9-irogers@google.com>

Thank you for your contribution! Sashiko AI review found 4 potential issue(s) to consider:

New issues:
- [Medium] Ignoring file descriptor 0 prevents capturing test output and causes resource leaks.
- [Medium] Using `sigprocmask()` in a multi-threaded application is undefined behavior according to POSIX.

Pre-existing issues:
- [High] Incomplete async-signal-safety mitigation leaves the heap vulnerable to deadlocks on `siglongjmp`.
- [High] Calling `waitpid` on pid -1 reaps arbitrary child processes if `fork` fails.
--

commit 2522220ee0e19bb1625cae967792e0223c0e6d7d
Author: Ian Rogers <irogers@google.com>

perf test: Refactor parallel poll loop to drain all pipes simultaneously

This commit refactors the perf test suite to poll and drain output
pipes from all running children simultaneously. It aims to prevent
tests from blocking on full pipe buffers during parallel execution.

> diff --git a/tools/perf/tests/builtin-test.c b/tools/perf/tests/builtin-test.c
> index 06507066213b1..dccd5d733272c 100644
> --- a/tools/perf/tests/builtin-test.c
> +++ b/tools/perf/tests/builtin-test.c
[ ... ]
> @@ -488,16 +496,241 @@ static void finish_test(struct child_test **child_tests, int running_test, int c
>  	}
>  	/* Clean up child process. */
>  	ret = finish_command(&child_test->process);

[Severity: High]
This is a pre-existing issue, but I noticed something about how failed
commands are handled in this cleanup path.

In start_test(), child->process.pid is initialized to -1. If start_command()
fails to fork, the pid remains -1 and an error is returned.

The __cmd_test() function catches this error, jumps to err_out, and calls
finish_test() on all initialized children. finish_test() then calls
finish_command(), which invokes waitpid().

Because the pid is still -1, does waitpid(-1, ...) wait for any child
process in the process group, potentially stealing the exit status of other
parallel tests or unrelated processes?

> +	child_test->process.pid = 0;
> +	if (child_test->err_output.len > 0) {
> +		struct strbuf merged = STRBUF_INIT;
> +
> +		if (child_test->err_output.buf)
> +			strbuf_addstr_safe(&merged, child_test->err_output.buf);
> +		if (err_output.buf)
> +			strbuf_addstr_safe(&merged, err_output.buf);
> +		strbuf_release(&err_output);
> +		err_output = merged;
>  	}
[ ... ]
> +static int strbuf_addstr_safe(struct strbuf *sb, const char *s)
> +{
> +	sigset_t set, oldset;
> +	int ret;
> +
> +	sigemptyset(&set);
> +	sigaddset(&set, SIGINT);
> +	sigaddset(&set, SIGTERM);
> +	sigprocmask(SIG_BLOCK, &set, &oldset);

[Severity: Medium]
Since perf is linked with pthreads and employs multi-threading, does
sigprocmask() result in unspecified behavior according to POSIX?

Would it be safer to use pthread_sigmask() here to guarantee correct signal
masking across threads?

> +	ret = strbuf_addstr(sb, s);
> +	sigprocmask(SIG_SETMASK, &oldset, NULL);
> +	return ret;
> +}
[ ... ]
> +static int finish_tests_parallel(struct child_test **child_tests, size_t num_tests, int width)
> +{
> +	size_t next_to_print = 0;
> +	struct pollfd *pfds;
> +	size_t *pfd_indices;
> +	size_t num_pfds = 0;
> +	int last_running = -1;
> +	size_t i;
> +	int last_suite_printed = -1;
> +
> +	global_pfds = calloc(num_tests, sizeof(*pfds));

[Severity: High]
This isn't a bug introduced by this patch, but the test harness uses a
signal handler (cmd_test_sig_handler) that triggers siglongjmp() on SIGINT
or SIGTERM.

If a signal interrupts a heap allocation or deallocation, the libc malloc
lock is left permanently held. The cleanup path err_out then calls
finish_test(), which allocates memory, causing a guaranteed deadlock.

While strbuf_addstr_safe() aims to mitigate this, the newly added heap
operations in finish_tests_parallel() like calloc(), zfree(), and
strbuf_release() remain unprotected. Additionally, the pre-existing
strbuf_addstr() call inside the poll loop of finish_test() was not updated
to use the new safe wrapper.

Is there a way we can ensure these allocations don't deadlock if a signal
arrives during execution?

> +	global_pfd_indices = calloc(num_tests, sizeof(*pfd_indices));
> +	pfds = global_pfds;
> +	pfd_indices = global_pfd_indices;
> +	if (!pfds || !pfd_indices) {
> +		free(pfds);
> +		free(pfd_indices);
> +		global_pfds = NULL;
> +		global_pfd_indices = NULL;
> +		return -ENOMEM;
> +	}
> +
> +	for (i = 0; i < num_tests; i++) {
> +		struct child_test *child = child_tests[i];
> +
> +		if (!child)
> +			continue;
> +		strbuf_init(&child->err_output, 0);
> +		if (child->process.err > 0)

[Severity: Medium]
If the perf test is run in an environment with standard input closed,
pipe() can legitimately return file descriptor 0 for the read end.

Does checking > 0 instead of >= 0 incorrectly treat this valid file
descriptor as invalid, causing the harness to silently fail to poll or
drain it?

> +			fcntl(child->process.err, F_SETFL, O_NONBLOCK);
> +	}
[ ... ]
> +			if (child->process.err > 0) {
> +				pfds[num_pfds].fd = child->process.err;
> +				pfds[num_pfds].events = POLLIN | POLLERR | POLLHUP | POLLNVAL;
> +				pfd_indices[num_pfds] = i;
> +				num_pfds++;
> +			}

[Severity: Medium]
As mentioned above, if child->process.err happens to be 0, it will also
be skipped here, meaning the output will be dropped entirely.

[ ... ]
> +		for (i = next_to_print; i < num_tests; i++) {
> +			struct child_test *child = child_tests[i];
> +
> +			if (!child || child->done)
> +				continue;
> +
> +			if (check_if_command_finished(&child->process)) {
> +				if (child->process.err > 0) {

[Severity: Medium]
And similarly, skipping file descriptor 0 here would cause a resource leak
since close() will be bypassed.

> +					drain_child_process_err(child);
> +					close(child->process.err);
> +					child->process.err = -1;
> +				}
> +				child->result = finish_command(&child->process);

-- 
Sashiko AI review · https://sashiko.dev/#/patchset/20260602073132.2653307-9-irogers@google.com?part=1

  reply	other threads:[~2026-06-02  7:47 UTC|newest]

Thread overview: 159+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-05-13 23:04 [PATCH v1 00/14] perf test: Harness improvements Ian Rogers
2026-05-13 23:04 ` [PATCH v1 01/14] perf jevents.py: Make generated C code more kernel style Ian Rogers
2026-05-13 23:04 ` [PATCH v1 02/14] perf pmu-events: Add API to get metric table name and iterate tables Ian Rogers
2026-05-14 11:42   ` sashiko-bot
2026-05-13 23:04 ` [PATCH v1 03/14] perf test: Drain pipe after child finishes to avoid losing output Ian Rogers
2026-05-13 23:04 ` [PATCH v1 04/14] perf test: Support dynamic test suites with setup callback and private data Ian Rogers
2026-05-14 12:10   ` sashiko-bot
2026-05-13 23:04 ` [PATCH v1 05/14] perf test pmu-events: A sub-test per metric table Ian Rogers
2026-05-13 23:04 ` [PATCH v1 06/14] perf test: Refactor parallel poll loop to drain all pipes simultaneously Ian Rogers
2026-05-14 14:27   ` sashiko-bot
2026-05-13 23:04 ` [PATCH v1 07/14] perf test: Show snippet failure output for verbose=1 Ian Rogers
2026-05-14 15:50   ` sashiko-bot
2026-05-13 23:04 ` [PATCH v1 08/14] perf test: Add summary reporting Ian Rogers
2026-05-14 16:10   ` sashiko-bot
2026-05-13 23:04 ` [PATCH v1 09/14] perf test: Fix subtest status alignment for multi-digit indexes Ian Rogers
2026-05-13 23:04 ` [PATCH v1 10/14] perf test: Skip shebang and SPDX comments in shell test descriptions Ian Rogers
2026-05-13 23:04 ` [PATCH v1 11/14] perf test: Split monolithic 'util' test suite into sub-tests Ian Rogers
2026-05-13 23:04 ` [PATCH v1 12/14] perf test: Add -j/--junit option for JUnit XML test reports Ian Rogers
2026-05-14 17:48   ` sashiko-bot
2026-05-13 23:04 ` [PATCH v1 13/14] perf test: Add shell test to validate JUnit XML reporting output Ian Rogers
2026-05-13 23:04 ` [PATCH v1 14/14] perf test: Remove /usr/bin/cc dependency from Intel PT shell test Ian Rogers
2026-05-14 18:28   ` sashiko-bot
2026-05-31  5:27 ` [PATCH v2 00/14] perf test: Accelerate parallel test harness and add JUnit XML reporting Ian Rogers
2026-05-31  5:27   ` [PATCH v2 01/14] perf jevents.py: Make generated C code more kernel style Ian Rogers
2026-05-31  5:36     ` sashiko-bot
2026-05-31  5:27   ` [PATCH v2 02/14] perf pmu-events: Add API to get metric table name and iterate tables Ian Rogers
2026-05-31  5:36     ` sashiko-bot
2026-05-31  5:27   ` [PATCH v2 03/14] perf test: Drain pipe after child finishes to avoid losing output Ian Rogers
2026-05-31  5:37     ` sashiko-bot
2026-05-31  5:27   ` [PATCH v2 04/14] perf test: Support dynamic test suites with setup callback and private data Ian Rogers
2026-05-31  5:27   ` [PATCH v2 05/14] perf test pmu-events: A sub-test per metric table Ian Rogers
2026-05-31  5:27   ` [PATCH v2 06/14] perf test: Refactor parallel poll loop to drain all pipes simultaneously Ian Rogers
2026-05-31  5:39     ` sashiko-bot
2026-05-31  5:27   ` [PATCH v2 07/14] perf test: Show snippet failure output for verbose=1 Ian Rogers
2026-05-31  5:37     ` sashiko-bot
2026-05-31  5:27   ` [PATCH v2 08/14] perf test: Add summary reporting Ian Rogers
2026-05-31  5:38     ` sashiko-bot
2026-05-31  5:27   ` [PATCH v2 09/14] perf test: Fix subtest status alignment for multi-digit indexes Ian Rogers
2026-05-31  5:27   ` [PATCH v2 10/14] perf test: Skip shebang and SPDX comments in shell test descriptions Ian Rogers
2026-05-31  5:46     ` sashiko-bot
2026-05-31  5:27   ` [PATCH v2 11/14] perf test: Split monolithic 'util' test suite into sub-tests Ian Rogers
2026-05-31  5:48     ` sashiko-bot
2026-05-31  5:27   ` [PATCH v2 12/14] perf test: Add -j/--junit option for JUnit XML test reports Ian Rogers
2026-05-31  5:43     ` sashiko-bot
2026-05-31  5:27   ` [PATCH v2 13/14] perf test: Add shell test to validate JUnit XML reporting output Ian Rogers
2026-05-31  5:27   ` [PATCH v2 14/14] perf test: Remove /usr/bin/cc dependency from Intel PT shell test Ian Rogers
2026-05-31  5:47     ` sashiko-bot
2026-05-31  6:37   ` [PATCH v3 00/14] perf test: Accelerate parallel test harness and add JUnit XML reporting Ian Rogers
2026-05-31  6:37     ` [PATCH v3 01/14] perf jevents.py: Make generated C code more kernel style Ian Rogers
2026-05-31  6:46       ` sashiko-bot
2026-05-31  6:37     ` [PATCH v3 02/14] perf pmu-events: Add API to get metric table name and iterate tables Ian Rogers
2026-05-31  6:37     ` [PATCH v3 03/14] perf test: Drain pipe after child finishes to avoid losing output Ian Rogers
2026-05-31  6:37     ` [PATCH v3 04/14] perf test: Support dynamic test suites with setup callback and private data Ian Rogers
2026-05-31  6:37     ` [PATCH v3 05/14] perf test pmu-events: A sub-test per metric table Ian Rogers
2026-05-31  6:37     ` [PATCH v3 06/14] perf test: Refactor parallel poll loop to drain all pipes simultaneously Ian Rogers
2026-05-31  6:55       ` sashiko-bot
2026-05-31  6:37     ` [PATCH v3 07/14] perf test: Show snippet failure output for verbose=1 Ian Rogers
2026-05-31  6:47       ` sashiko-bot
2026-05-31  6:37     ` [PATCH v3 08/14] perf test: Add summary reporting Ian Rogers
2026-05-31  6:50       ` sashiko-bot
2026-05-31  6:37     ` [PATCH v3 09/14] perf test: Fix subtest status alignment for multi-digit indexes Ian Rogers
2026-05-31  6:37     ` [PATCH v3 10/14] perf test: Skip shebang and SPDX comments in shell test descriptions Ian Rogers
2026-05-31  6:52       ` sashiko-bot
2026-05-31  6:37     ` [PATCH v3 11/14] perf test: Split monolithic 'util' test suite into sub-tests Ian Rogers
2026-05-31  6:37     ` [PATCH v3 12/14] perf test: Add -j/--junit option for JUnit XML test reports Ian Rogers
2026-05-31  6:37     ` [PATCH v3 13/14] perf test: Add shell test to validate JUnit XML reporting output Ian Rogers
2026-05-31  6:37     ` [PATCH v3 14/14] perf test: Remove /usr/bin/cc dependency from Intel PT shell test Ian Rogers
2026-05-31  6:58       ` sashiko-bot
2026-05-31  8:22     ` [PATCH v4 00/15] perf test: Accelerate parallel test harness and add JUnit XML reporting Ian Rogers
2026-05-31  8:22       ` [PATCH v4 01/15] perf jevents.py: Make generated C code more kernel style Ian Rogers
2026-05-31  8:22       ` [PATCH v4 02/15] perf pmu-events: Add API to get metric table name and iterate tables Ian Rogers
2026-05-31  8:22       ` [PATCH v4 03/15] perf test: Drain pipe after child finishes to avoid losing output Ian Rogers
2026-05-31  8:22       ` [PATCH v4 04/15] perf test: Support dynamic test suites with setup callback and private data Ian Rogers
2026-05-31  8:22       ` [PATCH v4 05/15] perf test pmu-events: A sub-test per metric table Ian Rogers
2026-05-31  8:22       ` [PATCH v4 06/15] tools subcmd: Robust fallback and existence checks for process reaping Ian Rogers
2026-05-31  8:33         ` sashiko-bot
2026-05-31  8:22       ` [PATCH v4 07/15] perf test: Refactor parallel poll loop to drain all pipes simultaneously Ian Rogers
2026-05-31  8:34         ` sashiko-bot
2026-05-31  8:22       ` [PATCH v4 08/15] perf test: Show snippet failure output for verbose=1 Ian Rogers
2026-05-31  8:31         ` sashiko-bot
2026-05-31  8:22       ` [PATCH v4 09/15] perf test: Add summary reporting Ian Rogers
2026-05-31  8:33         ` sashiko-bot
2026-05-31  8:22       ` [PATCH v4 10/15] perf test: Fix subtest status alignment for multi-digit indexes Ian Rogers
2026-05-31  8:33         ` sashiko-bot
2026-05-31  8:22       ` [PATCH v4 11/15] perf test: Skip shebang and SPDX comments in shell test descriptions Ian Rogers
2026-05-31  8:22       ` [PATCH v4 12/15] perf test: Split monolithic 'util' test suite into sub-tests Ian Rogers
2026-05-31  8:22       ` [PATCH v4 13/15] perf test: Add -j/--junit option for JUnit XML test reports Ian Rogers
2026-05-31  8:41         ` sashiko-bot
2026-05-31  8:22       ` [PATCH v4 14/15] perf test: Add shell test to validate JUnit XML reporting output Ian Rogers
2026-05-31  8:22       ` [PATCH v4 15/15] perf test: Remove /usr/bin/cc dependency from Intel PT shell test Ian Rogers
2026-05-31  8:38         ` sashiko-bot
2026-06-01  0:05       ` [PATCH v5 00/15] perf test: Accelerate parallel test harness and add JUnit XML reporting Ian Rogers
2026-06-01  0:05         ` [PATCH 01/15] perf jevents.py: Make generated C code more kernel style Ian Rogers
2026-06-01  0:05         ` [PATCH 02/15] perf pmu-events: Add API to get metric table name and iterate tables Ian Rogers
2026-06-01  0:05         ` [PATCH 03/15] perf test: Drain pipe after child finishes to avoid losing output Ian Rogers
2026-06-01  0:05         ` [PATCH 04/15] perf test: Support dynamic test suites with setup callback and private data Ian Rogers
2026-06-01  0:05         ` [PATCH 05/15] perf test pmu-events: A sub-test per metric table Ian Rogers
2026-06-01  0:05         ` [PATCH 06/15] tools subcmd: Robust fallback and existence checks for process reaping Ian Rogers
2026-06-01  0:19           ` sashiko-bot
2026-06-01  0:05         ` [PATCH 07/15] perf test: Refactor parallel poll loop to drain all pipes simultaneously Ian Rogers
2026-06-01  0:19           ` sashiko-bot
2026-06-01  0:05         ` [PATCH 08/15] perf test: Show snippet failure output for verbose=1 Ian Rogers
2026-06-01  0:05         ` [PATCH 09/15] perf test: Add summary reporting Ian Rogers
2026-06-01  0:17           ` sashiko-bot
2026-06-01  0:05         ` [PATCH 10/15] perf test: Fix subtest status alignment for multi-digit indexes Ian Rogers
2026-06-01  0:05         ` [PATCH 11/15] perf test: Skip shebang and SPDX comments in shell test descriptions Ian Rogers
2026-06-01  0:05         ` [PATCH 12/15] perf test: Split monolithic 'util' test suite into sub-tests Ian Rogers
2026-06-01  0:05         ` [PATCH 13/15] perf test: Add -j/--junit option for JUnit XML test reports Ian Rogers
2026-06-01  0:23           ` sashiko-bot
2026-06-01  0:05         ` [PATCH 14/15] perf test: Add shell test to validate JUnit XML reporting output Ian Rogers
2026-06-01  0:05         ` [PATCH 15/15] perf test: Remove /usr/bin/cc dependency from Intel PT shell test Ian Rogers
2026-06-01  0:23           ` sashiko-bot
2026-06-01  6:13         ` [PATCH v6 00/15] perf test: Accelerate parallel test harness and add JUnit XML reporting Ian Rogers
2026-06-01  6:13           ` [PATCH 01/15] perf jevents.py: Make generated C code more kernel style Ian Rogers
2026-06-01  6:25             ` sashiko-bot
2026-06-01  6:13           ` [PATCH 02/15] perf pmu-events: Add API to get metric table name and iterate tables Ian Rogers
2026-06-01  6:13           ` [PATCH 03/15] perf test: Drain pipe after child finishes to avoid losing output Ian Rogers
2026-06-01  6:13           ` [PATCH 04/15] perf test: Support dynamic test suites with setup callback and private data Ian Rogers
2026-06-01  6:27             ` sashiko-bot
2026-06-01  6:13           ` [PATCH 05/15] perf test pmu-events: A sub-test per metric table Ian Rogers
2026-06-01  6:13           ` [PATCH 06/15] tools subcmd: Robust fallback and existence checks for process reaping Ian Rogers
2026-06-01  6:28             ` sashiko-bot
2026-06-01  6:13           ` [PATCH 07/15] perf test: Refactor parallel poll loop to drain all pipes simultaneously Ian Rogers
2026-06-01  6:28             ` sashiko-bot
2026-06-01  6:13           ` [PATCH 08/15] perf test: Show snippet failure output for verbose=1 Ian Rogers
2026-06-01  6:25             ` sashiko-bot
2026-06-01  6:13           ` [PATCH 09/15] perf test: Add summary reporting Ian Rogers
2026-06-01  6:24             ` sashiko-bot
2026-06-01  6:13           ` [PATCH 10/15] perf test: Fix subtest status alignment for multi-digit indexes Ian Rogers
2026-06-01  6:13           ` [PATCH 11/15] perf test: Skip shebang and SPDX comments in shell test descriptions Ian Rogers
2026-06-01  6:13           ` [PATCH 12/15] perf test: Split monolithic 'util' test suite into sub-tests Ian Rogers
2026-06-01  6:13           ` [PATCH 13/15] perf test: Add -j/--junit option for JUnit XML test reports Ian Rogers
2026-06-01  6:33             ` sashiko-bot
2026-06-01  6:14           ` [PATCH 14/15] perf test: Add shell test to validate JUnit XML reporting output Ian Rogers
2026-06-01  6:14           ` [PATCH 15/15] perf test: Remove /usr/bin/cc dependency from Intel PT shell test Ian Rogers
2026-06-01  6:37             ` sashiko-bot
2026-06-02  7:31           ` [PATCH v7 00/16] perf test: Parallel harness optimizations, summary & JUnit XML Ian Rogers
2026-06-02  7:31             ` [PATCH v7] perf tpebs: Fix concurrent stop races and PID reuse hazards in tpebs_stop Ian Rogers
2026-06-02  7:46               ` sashiko-bot
2026-06-02  7:31             ` [PATCH v7] perf jevents.py: Make generated C code more kernel style Ian Rogers
2026-06-02  7:49               ` sashiko-bot
2026-06-02  7:31             ` [PATCH v7] perf pmu-events: Add API to get metric table name and iterate tables Ian Rogers
2026-06-02  7:31             ` [PATCH v7] perf test: Drain pipe after child finishes to avoid losing output Ian Rogers
2026-06-02  7:31             ` [PATCH v7] perf test: Support dynamic test suites with setup callback and private data Ian Rogers
2026-06-02  7:40               ` sashiko-bot
2026-06-02  7:31             ` [PATCH v7] perf test pmu-events: A sub-test per metric table Ian Rogers
2026-06-02  7:53               ` sashiko-bot
2026-06-02  7:31             ` [PATCH v7] tools subcmd: Robust fallback and existence checks for process reaping Ian Rogers
2026-06-02  7:31             ` [PATCH v7] perf test: Refactor parallel poll loop to drain all pipes simultaneously Ian Rogers
2026-06-02  7:47               ` sashiko-bot [this message]
2026-06-02  7:31             ` [PATCH v7] perf test: Show snippet failure output for verbose=1 Ian Rogers
2026-06-02  7:31             ` [PATCH v7] perf test: Add summary reporting Ian Rogers
2026-06-02  7:31             ` [PATCH v7] perf test: Fix subtest status alignment for multi-digit indexes Ian Rogers
2026-06-02  7:31             ` [PATCH v7] perf test: Skip shebang and SPDX comments in shell test descriptions Ian Rogers
2026-06-02  7:49               ` sashiko-bot
2026-06-02  7:31             ` [PATCH v7] perf test: Split monolithic 'util' test suite into sub-tests Ian Rogers
2026-06-02  7:31             ` [PATCH v7] perf test: Add -j/--junit option for JUnit XML test reports Ian Rogers
2026-06-02  7:31             ` [PATCH v7] perf test: Add shell test to validate JUnit XML reporting output Ian Rogers
2026-06-02  9:45               ` sashiko-bot

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20260602074753.59A441F00893@smtp.kernel.org \
    --to=sashiko-bot@kernel.org \
    --cc=irogers@google.com \
    --cc=linux-perf-users@vger.kernel.org \
    --cc=sashiko-reviews@lists.linux.dev \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox