Add a tracefs file to configure the trace remote polling period. Keep
the default value to 100ms.

Signed-off-by: Vincent Donnefort <[email protected]>

diff --git a/kernel/trace/trace_remote.c b/kernel/trace/trace_remote.c
index 5536e0df4379..204d5bef7a8c 100644
--- a/kernel/trace/trace_remote.c
+++ b/kernel/trace/trace_remote.c
@@ -425,7 +425,8 @@ static void trace_remote_do_poll(struct trace_remote 
*remote)
 
        ring_buffer_poll_remote(remote->trace_buffer, RING_BUFFER_ALL_CPUS);
        yield = trace_remote_do_dmesg(remote);
-       schedule_delayed_work(&remote->poll_work, yield ? 0 : 
msecs_to_jiffies(remote->poll_ms));
+       schedule_delayed_work(&remote->poll_work,
+                             yield ? 0 : 
msecs_to_jiffies(READ_ONCE(remote->poll_ms)));
 }
 
 static void __poll_remote(struct work_struct *work)
@@ -1135,6 +1136,40 @@ static int dump_on_panic_show(struct seq_file *s, void 
*unused)
 }
 DEFINE_TRACE_REMOTE_ATTRIBUTE(dump_on_panic);
 
+static ssize_t poll_ms_write(struct file *filp, const char __user *ubuf, 
size_t cnt, loff_t *ppos)
+{
+       struct seq_file *seq = filp->private_data;
+       struct trace_remote *remote = seq->private;
+       unsigned int val;
+       int ret;
+
+       ret = kstrtouint_from_user(ubuf, cnt, 10, &val);
+       if (ret)
+               return ret;
+
+       if (!val)
+               return -EINVAL;
+
+       guard(mutex)(&remote->lock);
+
+       if (val < remote->poll_ms && remote->poll_cnt)
+               mod_delayed_work(system_percpu_wq, &remote->poll_work, 
msecs_to_jiffies(val));
+
+       WRITE_ONCE(remote->poll_ms, val);
+
+       return cnt;
+}
+
+static int poll_ms_show(struct seq_file *s, void *unused)
+{
+       struct trace_remote *remote = s->private;
+
+       seq_printf(s, "%u\n", READ_ONCE(remote->poll_ms));
+
+       return 0;
+}
+DEFINE_TRACE_REMOTE_ATTRIBUTE(poll_ms);
+
 static int trace_remote_init_tracefs(const char *name, struct trace_remote 
*remote)
 {
        struct dentry *remote_d, *percpu_d, *d;
@@ -1167,6 +1202,10 @@ static int trace_remote_init_tracefs(const char *name, 
struct trace_remote *remo
        if (!d)
                goto err;
 
+       d = trace_create_file("poll_ms", TRACEFS_MODE_WRITE, remote_d, remote, 
&poll_ms_fops);
+       if (!d)
+               goto err;
+
        d = trace_create_file("buffer_size_kb", TRACEFS_MODE_WRITE, remote_d, 
remote,
                              &buffer_size_kb_fops);
        if (!d)
-- 
2.55.0.691.gc56d675ccc-goog


Reply via email to