• Steven Rostedt's avatar
    tracing/timerlat: Add interface_lock around clearing of kthread in stop_kthread() · 5bfbcd1e
    Steven Rostedt authored
    The timerlat interface will get and put the task that is part of the
    "kthread" field of the osn_var to keep it around until all references are
    released. But here's a race in the "stop_kthread()" code that will call
    put_task_struct() on the kthread if it is not a kernel thread. This can
    race with the releasing of the references to that task struct and the
    put_task_struct() can be called twice when it should have been called just
    once.
    
    Take the interface_lock() in stop_kthread() to synchronize this change.
    But to do so, the function stop_per_cpu_kthreads() needs to change the
    loop from for_each_online_cpu() to for_each_possible_cpu() and remove the
    cpu_read_lock(), as the interface_lock can not be taken while the cpu
    locks are held. The only side effect of this change is that it may do some
    extra work, as the per_cpu variables of the offline CPUs would not be set
    anyway, and would simply be skipped in the loop.
    
    Remove unneeded "return;" in stop_kthread().
    
    Cc: stable@vger.kernel.org
    Cc: Masami Hiramatsu <mhiramat@kernel.org>
    Cc: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
    Cc: Tomas Glozar <tglozar@redhat.com>
    Cc: John Kacur <jkacur@redhat.com>
    Cc: "Luis Claudio R. Goncalves" <lgoncalv@redhat.com>
    Link: https://lore.kernel.org/20240905113359.2b934242@gandalf.local.home
    Fixes: e88ed227 ("tracing/timerlat: Add user-space interface")
    Signed-off-by: default avatarSteven Rostedt (Google) <rostedt@goodmis.org>
    5bfbcd1e
trace_osnoise.c 76.1 KB