Thread (12 messages) 12 messages, 2 authors, 6d ago

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
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help