Re: [PATCH v3 9/9] tracing/osnoise: Refuse timerlat fd open if tracer inactive
flat view
From: sashiko-bot@kernel.org
Date: 2026-10-14 02:39:31
Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider: - [High] trace: timerlat_fd_release unconditionally resets cpu state -- commit 3a852123b0f7d3294fb2be0fe904429d8ee1fccc Author: Crystal Wood [off-list ref] tracing/osnoise: Refuse timerlat fd open if tracer inactive This commit refuses to open a timerlat file descriptor when there are no active instances. This prevents the file descriptor from remaining active during reconfiguration, which could cause WARN splats.
quoted hunk ↗ jump to hunk
diff --git a/kernel/trace/trace_osnoise.c b/kernel/trace/trace_osnoise.c index 9ca45b0b8cb39..2511a9b763b98 100644 --- a/kernel/trace/trace_osnoise.c +++ b/kernel/trace/trace_osnoise.c@@ -2506,7 +2506,8 @@ static int timerlat_fd_open(struct inode *inode, struct file *file) * This file is accessible only if timerlat is enabled, and * NO_OSNOISE_WORKLOAD is set. */ - if (!timerlat_enabled() || test_bit(OSN_WORKLOAD, &osnoise_options)) + if (!osnoise_has_registered_instances() || !timerlat_enabled() || + test_bit(OSN_WORKLOAD, &osnoise_options)) return -EINVAL; guard(migrate)();
[Severity: High]
Does this code still allow state corruption during the fd release path?
Looking at timerlat_fd_release() in kernel/trace/trace_osnoise.c,
osn_reset_cpu() is called unconditionally, bypassing the active session check:
kernel/trace/trace_osnoise.c:timerlat_fd_release() {
...
if (fdd == osn_var->fdd)
timerlat_fd_detach(fdd);
osn_reset_cpu(fdd->cpu);
...
}
Can the following sequence occur?
1. Userspace opens a timerlat fd, creating an active tracing session (fdd1).
2. Tracing is stopped or reconfigured (e.g. via
/sys/kernel/tracing/osnoise/cpus), calling stop_kthread(). This detaches
fdd1 (osn_var->fdd = NULL) but leaves the fd open in userspace.
3. Tracing is restarted, and userspace opens a new timerlat fd on the same
CPU (fdd2). This becomes the active session (osn_var->fdd = fdd2) and
tlat_var->timer is initialized and armed.
4. Userspace closes the first fd (fdd1).
5. timerlat_fd_release() is called. Because fdd1 != osn_var->fdd, it skips
detachment, but unconditionally calls osn_reset_cpu(fdd1->cpu).
Would this unconditional reset wipe the active tracing session's state,
including zero-filling the armed hrtimer of the active fdd2 session,
potentially leading to timer tree corruption and a kernel panic?
--
Sashiko AI review · https://sashiko.dev/#/patchset/20261014022640.695786-1-crwood@redhat.com?part=9