• Nico Pache's avatar
    tracing/osnoise: Fix possible recursive locking in stop_per_cpu_kthreads · 99ee9317
    Nico Pache authored
    There is a recursive lock on the cpu_hotplug_lock.
    
    In kernel/trace/trace_osnoise.c:<start/stop>_per_cpu_kthreads:
        - start_per_cpu_kthreads calls cpus_read_lock() and if
    	start_kthreads returns a error it will call stop_per_cpu_kthreads.
        - stop_per_cpu_kthreads then calls cpus_read_lock() again causing
          deadlock.
    
    Fix this by calling cpus_read_unlock() before calling
    stop_per_cpu_kthreads. This behavior can also be seen in commit
    f46b1652 ("trace/hwlat: Implement the per-cpu mode").
    
    This error was noticed during the LTP ftrace-stress-test:
    
    WARNING: possible recursive locking detected
    --------------------------------------------
    sh/275006 is trying to acquire lock:
    ffffffffb02f5400 (cpu_hotplug_lock){++++}-{0:0}, at: stop_per_cpu_kthreads
    
    but task is already holding lock:
    ffffffffb02f5400 (cpu_hotplug_lock){++++}-{0:0}, at: start_per_cpu_kthreads
    
    other info that might help us debug this:
     Possible unsafe locking scenario:
    
          CPU0
          ----
     lock(cpu_hotplug_lock);
     lock(cpu_hotplug_lock);
    
     *** DEADLOCK ***
    
    May be due to missing lock nesting notation
    
    3 locks held by sh/275006:
     #0: ffff8881023f0470 (sb_writers#24){.+.+}-{0:0}, at: ksys_write
     #1: ffffffffb084f430 (trace_types_lock){+.+.}-{3:3}, at: rb_simple_write
     #2: ffffffffb02f5400 (cpu_hotplug_lock){++++}-{0:0}, at: start_per_cpu_kthreads
    
    Link: https://lkml.kernel.org/r/20220919144932.3064014-1-npache@redhat.com
    
    Fixes: c8895e27 ("trace/osnoise: Support hotplug operations")
    Signed-off-by: default avatarNico Pache <npache@redhat.com>
    Acked-by: default avatarDaniel Bristot de Oliveira <bristot@kernel.org>
    Signed-off-by: default avatarSteven Rostedt (Google) <rostedt@goodmis.org>
    99ee9317
trace_osnoise.c 59.1 KB