On Thu, 22 Aug 2024 08:20:52 -0300 "Luis Claudio R. Goncalves" <lgonc...@redhat.com> wrote:
> You mean the > > + if (!tlat_var->kthread) { > + /* the fd has been closed already */ > > bit or the kthread handling in rtla itself? > > As Tomas already said, thank you for testing and reviewing the suggested fix! The close only happens once, but the kthread does get freed elsewhere. I used my new persistent ring buffer to debug this! I'll be posting some more patches that allow trace_printk() and friends to use the persistent ring buffer (or any instance) soon. For this bug, I would recommend instead doing: diff --git a/kernel/trace/trace_osnoise.c b/kernel/trace/trace_osnoise.c index 66a871553d4a..53de719f35cb 100644 --- a/kernel/trace/trace_osnoise.c +++ b/kernel/trace/trace_osnoise.c @@ -2579,7 +2587,8 @@ static int timerlat_fd_release(struct inode *inode, struct file *file) osn_var = per_cpu_ptr(&per_cpu_osnoise_var, cpu); tlat_var = per_cpu_ptr(&per_cpu_timerlat_var, cpu); - hrtimer_cancel(&tlat_var->timer); + if (tlat_var->kthread) + hrtimer_cancel(&tlat_var->timer); memset(tlat_var, 0, sizeof(*tlat_var)); osn_var->sampling = 0; -- Steve