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 <[email protected]> --- 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
