[PATCH v7 05/20] tracing/remotes: Annotate remote shared fields with READ_ONCE/WRITE_ONCE
From: Vincent Donnefort
Date: Thu Sep 24 2026 - 11:04:25 EST
tracing_on_show(), remote_event_enable_show(), and buffer_size_kb_show()
read remote->tracing_on, evt->enabled, and remote->trace_buffer_size
without holding remote->lock, while the corresponding write and cmdline
functions modify them under the lock.
While this is unlikely to cause issues in practice, annotate the accesses
with READ_ONCE() and WRITE_ONCE() to keep KCSAN happy.
Signed-off-by: Vincent Donnefort <vdonnefort@xxxxxxxxxx>
---
kernel/trace/trace_remote.c | 15 ++++++++-------
1 file changed, 8 insertions(+), 7 deletions(-)
diff --git a/kernel/trace/trace_remote.c b/kernel/trace/trace_remote.c
index aa76845a630a..517546e8343a 100644
--- a/kernel/trace/trace_remote.c
+++ b/kernel/trace/trace_remote.c
@@ -136,7 +136,7 @@ static int trace_remote_enable_tracing(struct trace_remote *remote)
return ret;
}
- remote->tracing_on = true;
+ WRITE_ONCE(remote->tracing_on, true);
return 0;
}
@@ -155,7 +155,7 @@ static int trace_remote_disable_tracing(struct trace_remote *remote)
return ret;
ring_buffer_poll_remote(remote->trace_buffer, RING_BUFFER_ALL_CPUS);
- remote->tracing_on = false;
+ WRITE_ONCE(remote->tracing_on, false);
trace_remote_try_unload(remote);
return 0;
@@ -250,11 +250,12 @@ tracing_on_write(struct file *filp, const char __user *ubuf, size_t cnt, loff_t
return cnt;
}
+
static int tracing_on_show(struct seq_file *s, void *unused)
{
struct trace_remote *remote = s->private;
- seq_printf(s, "%d\n", remote->tracing_on);
+ seq_printf(s, "%d\n", READ_ONCE(remote->tracing_on));
return 0;
}
@@ -281,7 +282,7 @@ static ssize_t buffer_size_kb_write(struct file *filp, const char __user *ubuf,
if (trace_remote_loaded(remote))
return -EBUSY;
- remote->trace_buffer_size = val;
+ WRITE_ONCE(remote->trace_buffer_size, val);
return cnt;
}
@@ -290,7 +291,7 @@ static int buffer_size_kb_show(struct seq_file *s, void *unused)
{
struct trace_remote *remote = s->private;
- seq_printf(s, "%lu (%s)\n", remote->trace_buffer_size >> 10,
+ seq_printf(s, "%lu (%s)\n", READ_ONCE(remote->trace_buffer_size) >> 10,
trace_remote_loaded(remote) ? "loaded" : "unloaded");
return 0;
@@ -1131,7 +1132,7 @@ trace_remote_enable_event(struct trace_remote *remote, struct remote_event *evt,
if (ret)
return ret;
- evt->enabled = enable;
+ WRITE_ONCE(evt->enabled, enable);
return 0;
}
@@ -1140,7 +1141,7 @@ static int remote_event_enable_show(struct seq_file *s, void *unused)
{
struct remote_event *evt = s->private;
- seq_printf(s, "%d\n", evt->enabled);
+ seq_printf(s, "%d\n", READ_ONCE(evt->enabled));
return 0;
}
--
2.56.0.rc1.310.g51773c2048-goog