Linux Perf Users
 help / color / mirror / Atom feed
From: sashiko-bot@kernel.org
To: "Fredrik Markstrom" <fredrik.markstrom@est.tech>
Cc: linux-perf-users@vger.kernel.org
Subject: Re: [PATCH v2 3/3] DO NOT MERGE: selftests: perf_events: Add device memory callchain unwinding test
Date: Thu, 30 Apr 2026 12:08:40 +0000	[thread overview]
Message-ID: <20260430120841.A2DD6C2BCB3@smtp.kernel.org> (raw)
In-Reply-To: <20260430-master-with-pfix-v3-v2-3-bd526ec04a75@est.tech>

Thank you for your contribution! Sashiko AI review found 4 potential issue(s) to consider:
- [Medium] The test silently passes if `/dev/mem` mmap fails or `perf record` encounters an error.
- [Medium] Race condition due to missing synchronization between child process initialization and `perf record`.
- [Medium] The temporary directory and `perf.data` file are permanently leaked on every test run.
- [Medium] The child process can become a runaway process consuming 100% CPU if the parent is terminated.
--

commit c99f3e3dd4b06157e6d6eea6478e0ee3ffe3951a
Author: Fredrik Markstrom <fredrik.markstrom@est.tech>
DO NOT MERGE: selftests: perf_events: Add device memory callchain unwinding test

This commit adds a kselftest that uses perf record to sample a process
that has its frame pointer pointing into a device memory mapping created
via /dev/mem. The test is designed to verify that the kernel survives
without crashing due to synchronous external aborts.

> diff --git a/tools/testing/selftests/perf_events/test_perf_vmio.c b/tools/testing/selftests/perf_events/test_perf_vmio.c
> new file mode 100644
> index 0000000000000..c9ceee3f15927
> --- /dev/null
> +++ b/tools/testing/selftests/perf_events/test_perf_vmio.c
[ ... ]
> +	/* Fork a spinner child with FP pointing into device memory */
> +	spin_pid = fork();
> +	if (spin_pid < 0) {
> +		close(fd);
> +		rmdir(tmpdir);
> +		ASSERT_GE(spin_pid, 0);
> +	}
> +	if (spin_pid == 0) {

If the parent test process crashes or is killed by a test runner timeout
before executing kill(spin_pid, SIGKILL), will the child process be orphaned
and run indefinitely in the busy-wait loop?

Could prctl(PR_SET_PDEATHSIG, SIGKILL) be used here to ensure the child is
automatically killed if the parent dies?

> +		/*
> +		 * mmap /dev/mem in the child so remap_pfn_range populates
> +		 * PTEs directly. fork() does not copy PTEs for VM_PFNMAP
[ ... ]
> +		 */
> +		m = mmap(NULL, off + page_size, PROT_READ | PROT_WRITE,
> +			 MAP_SHARED, fd, page);
> +		if (m == MAP_FAILED)
> +			_exit(2);

If this mmap() fails (for example, due to CONFIG_STRICT_DEVMEM), the child
exits immediately. Since the parent ignores the child's exit status, does
this cause the test to silently pass without ever exercising the
vulnerability?

> +		fp = (char *)m + off;
> +		__asm__ volatile(
> +			"mov x29, %0\n"
> +			"1: b 1b\n"
> +			: : "r"(fp) : "x29", "memory");
> +		_exit(0);
> +	}
> +
> +	/* Launch perf to sample the spinner */
> +	snprintf(pid_str, sizeof(pid_str), "%d", spin_pid);
> +
> +	perf_pid = fork();

Is there a race condition here between the child process initialization and
perf record?

If the system is heavily loaded, perf record might finish its 3-second
sleep before the child process completes the mmap() and reaches the
assembly loop.

Could we add synchronization, such as a pipe or file lock, to ensure the
child is ready before perf starts sampling?

[ ... ]
> +	waitpid(perf_pid, &pst, 0);
> +
> +	kill(spin_pid, SIGKILL);
> +	waitpid(spin_pid, NULL, 0);
> +	close(fd);
> +
> +	/* Clean up perf output */
> +	rmdir(tmpdir);

Does rmdir() fail with ENOTEMPTY because perf record generated a perf.data
file inside the directory?

Since unlink() is not called on the perf.data file, do the directory and
file leak on the file system after every test run?

> +
> +	if (!WIFEXITED(pst))
> +		SKIP(return, "perf terminated abnormally");
> +	if (WEXITSTATUS(pst) == 1)
> +		SKIP(return, "perf not available");
> +
> +	/*
> +	 * The real test is that the kernel survived. If we got here
> +	 * without a synchronous external abort, the guard worked.
> +	 */
> +	TH_LOG("kernel survived perf sampling with FP in device memory");

If the child exited early because mmap() failed, perf record will fail to
attach to the zombie process and might exit with a code other than 1 (such
as 255).

Because the check here only looks for WEXITSTATUS(pst) == 1, does this
allow other perf failures to bypass the check and incorrectly log that the
test passed?

-- 
Sashiko AI review · https://sashiko.dev/#/patchset/20260430-master-with-pfix-v3-v2-0-bd526ec04a75@est.tech?part=3

      reply	other threads:[~2026-04-30 12:08 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-04-30 10:55 [PATCH v2 0/3] arm64: perf: Skip device memory during user callchain unwinding Fredrik Markstrom
2026-04-30 10:55 ` [PATCH v2 1/3] " Fredrik Markstrom
2026-04-30 11:48   ` sashiko-bot
2026-05-01  9:54   ` Fredrik Markstrom
2026-04-30 10:55 ` [PATCH v2 2/3] DO NOT MERGE: arm64: perf: Add skip_vmio parameter to control device memory callchain guard Fredrik Markstrom
2026-04-30 11:55   ` sashiko-bot
2026-04-30 10:55 ` [PATCH v2 3/3] DO NOT MERGE: selftests: perf_events: Add device memory callchain unwinding test Fredrik Markstrom
2026-04-30 12:08   ` sashiko-bot [this message]

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=20260430120841.A2DD6C2BCB3@smtp.kernel.org \
    --to=sashiko-bot@kernel.org \
    --cc=fredrik.markstrom@est.tech \
    --cc=linux-perf-users@vger.kernel.org \
    --cc=sashiko@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