On Wed, Aug 12, 2026 at 05:13:04PM +0000, [email protected] wrote:
> Thank you for your contribution! Sashiko AI review found 2 potential issue(s) 
> to consider:
> - [Low] Data race on `remote->poll_ms` due to lockless reads.
> - [Low] Improper mixing of goto-based error handling and scope-based cleanup 
> (__free) in `trace_remote_iter`.
> --
> 
> --- Patch [15]: [PATCH v5 15/18] tracing/remotes: Add poll_ms tracefs file ---
> commit a661ee191c6d806ed0a716f67237aca890febe25
> Author: Vincent Donnefort <[email protected]>
> 
> tracing/remotes: Add poll_ms tracefs file
> 
> Add a tracefs file to configure the trace remote polling period. Keep
> the default value to 100ms.
> 
> > diff --git a/kernel/trace/trace_remote.c b/kernel/trace/trace_remote.c
> > index 5536e0df43795..b1c75666ab638 100644
> > --- a/kernel/trace/trace_remote.c
> > +++ b/kernel/trace/trace_remote.c
> > @@ -1135,6 +1135,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));
> > +
> > +   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", remote->poll_ms);
> 
> [Severity: Low]
> Does this code introduce a data race on remote->poll_ms?
> 
> In poll_ms_write(), remote->poll_ms is modified while holding remote->lock.
> However, in poll_ms_show(), remote->poll_ms is read without holding
> remote->lock.
> 
> It appears this could also cause a data race with lockless reads in
> trace_remote_do_poll():
> 
> kernel/trace/trace_remote.c:trace_remote_do_poll() {
>     ...
>       schedule_delayed_work(&remote->poll_work, yield ? 0 : 
> msecs_to_jiffies(remote->poll_ms));
> }
> 
> Could this concurrent read and write cause a data race, potentially leading
> to torn reads or violating kernel concurrency expectations?

Fair enough... I'll WRITE_ONCE/READ_ONCE.

-- 
Vincent

> 
> [ ... ]
> 
> Also, looking at trace_remote_iter() in kernel/trace/trace_remote.c:
> 
> kernel/trace/trace_remote.c:trace_remote_iter() {
>       struct trace_remote_iterator *iter __free(kfree) = kzalloc_obj(*iter);
>     ...
>               if (WARN_ON_ONCE(remote->dmesg)) {
>                       ret = -EBUSY;
>                       goto err;
>               }
>     ...
> err:
>       switch (type) {
>       case TRI_PANIC:
>               break;
>       default:
>               trace_remote_put(remote);
>       }
>       return ERR_PTR(ret);
> }
> 
> [Severity: Low]
> Does this code incorrectly mix goto-based error handling and scope-based
> cleanup (__free)?
> 
> The cleanup subsystem guidelines prohibit mixing goto-based error paths
> with __free() variable declarations in the same function. While it does not
> appear to cause a concrete resource leak or double-free in this specific
> instance, could this create confusing ownership semantics and risk future
> bugs during refactoring?
> 
> -- 
> Sashiko AI review ยท 
> https://sashiko.dev/#/patchset/[email protected]?part=15

Reply via email to