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


Reply via email to