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
