linux/kernel/trace
Ran Xiaokai 7e6b3fcc9c tracing/osnoise: Fix possible recursive locking for cpus_read_lock()
Lockdep reports this deadlock log:

osnoise: could not start sampling thread
============================================
WARNING: possible recursive locking detected
--------------------------------------------
       CPU0
       ----
  lock(cpu_hotplug_lock);
  lock(cpu_hotplug_lock);

 Call Trace:
  <TASK>
  print_deadlock_bug+0x282/0x3c0
  __lock_acquire+0x1610/0x29a0
  lock_acquire+0xcb/0x2d0
  cpus_read_lock+0x49/0x120
  stop_per_cpu_kthreads+0x7/0x60
  start_kthread+0x103/0x120
  osnoise_hotplug_workfn+0x5e/0x90
  process_one_work+0x44f/0xb30
  worker_thread+0x33e/0x5e0
  kthread+0x206/0x3b0
  ret_from_fork+0x31/0x50
  ret_from_fork_asm+0x11/0x20
  </TASK>

This is the deadlock scenario:
osnoise_hotplug_workfn()
  guard(cpus_read_lock)();      // first lock call
  start_kthread(cpu)
    if (IS_ERR(kthread)) {
      stop_per_cpu_kthreads(); {
        cpus_read_lock();      // second lock call. Cause the AA deadlock
      }
    }

It is not necessary to call stop_per_cpu_kthreads() which stops osnoise
kthread for every other CPUs in the system if a failure occurs during
hotplug of a certain CPU.
For start_per_cpu_kthreads(), if the start_kthread() call fails,
this function calls stop_per_cpu_kthreads() to handle the error.
Therefore, similarly, there is no need to call stop_per_cpu_kthreads()
again within start_kthread().
So just remove stop_per_cpu_kthreads() from start_kthread to solve this issue.

Cc: stable@vger.kernel.org
Link: https://lore.kernel.org/20250321095249.2739397-1-ranxiaokai627@163.com
Fixes: c8895e271f ("trace/osnoise: Support hotplug operations")
Signed-off-by: Ran Xiaokai <ran.xiaokai@zte.com.cn>
Signed-off-by: Steven Rostedt (Google) <rostedt@goodmis.org>
2025-03-23 08:34:31 -04:00
..
rv verification/dot2k: Auto patch current kernel source 2024-12-27 14:39:35 -05:00
blktrace.c blktrace: remove redundant return at end of function 2024-12-23 08:17:23 -07:00
bpf_trace.c bpf-next-6.14 2025-01-23 08:04:07 -08:00
bpf_trace.h
error_report-traces.c
fgraph.c fgraph: Remove calltime and rettime from generic operations 2025-01-21 21:55:49 -05:00
fprobe.c fprobe: Fix accounting of when to unregister from function graph 2025-02-21 09:36:12 -05:00
ftrace_internal.h
ftrace.c ftrace: Do not add duplicate entries in subops manager ops 2025-02-21 09:36:12 -05:00
Kconfig fprobe: Rewrite fprobe on function-graph tracer 2024-12-26 10:50:05 -05:00
kprobe_event_gen_test.c
Makefile
pid_list.c pid: allow pid_max to be set per pid namespace 2024-12-02 11:25:25 +01:00
pid_list.h
power-traces.c
preemptirq_delay_test.c minmax: make generic MIN() and MAX() macros available everywhere 2024-07-28 15:49:18 -07:00
rethook.c
ring_buffer_benchmark.c ring-buffer: Use str_low_high() helper in ring_buffer_producer() 2024-10-19 11:12:25 -04:00
ring_buffer.c ring-buffer: Fix typo in comment about header page pointer 2025-03-06 13:35:26 -05:00
rpm-traces.c
synth_event_gen_test.c
trace_benchmark.c
trace_benchmark.h
trace_boot.c
trace_branch.c tracing: Remove TRACE_EVENT_FL_FILTERED logic 2024-10-08 15:24:49 -04:00
trace_btf.c
trace_btf.h
trace_clock.c tracing: Use atomic64_inc_return() in trace_clock_counter() 2024-10-09 19:59:49 -04:00
trace_dynevent.c tracing/string: Create and use __free(argv_free) in trace_dynevent.c 2024-12-26 10:38:37 -05:00
trace_dynevent.h
trace_entries.h fgraph: Remove calltime and rettime from generic operations 2025-01-21 21:55:49 -05:00
trace_eprobe.c tracing: Constify struct event_trigger_ops 2025-03-20 07:04:00 -04:00
trace_event_perf.c trace/trace_event_perf: remove duplicate samples on the first tracepoint event 2024-10-09 19:44:54 -04:00
trace_events_filter_test.h
trace_events_filter.c tracing: Switch trace_events_filter.c code over to use guard() 2024-12-26 10:38:37 -05:00
trace_events_hist.c tracing: Constify struct event_trigger_ops 2025-03-20 07:04:00 -04:00
trace_events_inject.c tracing: Have format file honor EVENT_FILE_FL_FREED 2024-08-07 18:12:46 -04:00
trace_events_synth.c tracing: Align synth event print fmt 2025-03-23 08:34:31 -04:00
trace_events_trigger.c tracing: Constify struct event_trigger_ops 2025-03-20 07:04:00 -04:00
trace_events_user.c tracing/user_events: Slightly simplify user_seq_show() 2025-03-06 13:35:27 -05:00
trace_events.c tracing: Fix memory leak when reading set_event file 2025-02-21 09:36:12 -05:00
trace_export.c
trace_fprobe.c tracing: Adopt __free() and guard() for trace_fprobe.c 2025-01-16 21:27:07 -05:00
trace_functions_graph.c fgraph: Fix set_graph_notrace with setting TRACE_GRAPH_NOTRACE_BIT 2025-02-08 08:36:45 -05:00
trace_functions.c ftrace: Correct preemption accounting for function tracing. 2025-02-21 09:36:12 -05:00
trace_hwlat.c tracing: Remove TRACE_EVENT_FL_FILTERED logic 2024-10-08 15:24:49 -04:00
trace_irqsoff.c fgraph: Remove calltime and rettime from generic operations 2025-01-21 21:55:49 -05:00
trace_kdb.c trace: kdb: Replace simple_strtoul with kstrtoul in kdb_ftdump 2024-11-02 08:33:13 +00:00
trace_kprobe_selftest.c
trace_kprobe_selftest.h
trace_kprobe.c tracing/kprobes: Simplify __trace_kprobe_create() by removing gotos 2025-01-10 09:01:14 +09:00
trace_mmiotrace.c tracing: Remove TRACE_EVENT_FL_FILTERED logic 2024-10-08 15:24:49 -04:00
trace_nop.c
trace_osnoise.c tracing/osnoise: Fix possible recursive locking for cpus_read_lock() 2025-03-23 08:34:31 -04:00
trace_output.c tracing: Check "%s" dereference via the field and not the TP_printk format 2024-12-17 11:40:11 -05:00
trace_output.h
trace_preemptirq.c tracing: Fix archs that still call tracepoints without RCU watching 2024-12-05 09:28:58 -05:00
trace_printk.c
trace_probe_kernel.h
trace_probe_tmpl.h tracing/fprobe: Enable fprobe events with CONFIG_DYNAMIC_FTRACE_WITH_ARGS 2024-12-26 10:50:04 -05:00
trace_probe.c tracing: Use __free() in trace_probe for cleanup 2025-01-10 09:00:13 +09:00
trace_probe.h
trace_recursion_record.c
trace_sched_switch.c pid: allow pid_max to be set per pid namespace 2024-12-02 11:25:25 +01:00
trace_sched_wakeup.c fgraph: Remove calltime and rettime from generic operations 2025-01-21 21:55:49 -05:00
trace_selftest_dynamic.c
trace_selftest.c fgraph: Pass ftrace_regs to retfunc 2024-12-26 10:50:03 -05:00
trace_seq.c
trace_stack.c tracing: Switch trace_stack.c code over to use guard() 2024-12-26 10:38:37 -05:00
trace_stat.c tracing: Switch trace_stat.c code over to use guard() 2024-12-26 10:38:37 -05:00
trace_stat.h
trace_synth.h
trace_syscalls.c tracing/perf: Add might_fault check to syscall probes 2024-10-09 17:09:46 -04:00
trace_uprobe.c tracing/uprobe: Adopt guard() and scoped_guard() 2025-01-10 09:00:12 +09:00
trace.c tracing: Add traceoff_after_boot option 2025-02-25 13:46:40 -05:00
trace.h tracing: Constify struct event_trigger_ops 2025-03-20 07:04:00 -04:00
tracing_map.c tracing: Fix cmp_entries_dup() to respect sort() comparison rules 2024-12-04 10:38:24 -05:00
tracing_map.h