Commit b484a02
tracing/timerlat: Drop interface_lock in stop_kthread()
stop_kthread() is the offline callback for "trace/osnoise:online", since
commit 5bfbcd1 ("tracing/timerlat: Add interface_lock around clearing
of kthread in stop_kthread()"), the following ABBA deadlock scenario is
introduced:
T1 | T2 [BP] | T3 [AP]
osnoise_hotplug_workfn() | work_for_cpu_fn() | cpuhp_thread_fun()
| _cpu_down() | osnoise_cpu_die()
mutex_lock(&interface_lock) | | stop_kthread()
| cpus_write_lock() | mutex_lock(&interface_lock)
cpus_read_lock() | cpuhp_kick_ap() |
As the interface_lock here in just for protecting the "kthread" field of
the osn_var, use xchg() instead to fix this issue. Also use
for_each_online_cpu() back in stop_per_cpu_kthreads() as it can take
cpu_read_lock() again.
Cc: stable@vger.kernel.org
Cc: Masami Hiramatsu <mhiramat@kernel.org>
Cc: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
Link: https://lore.kernel.org/20240924094515.3561410-3-liwei391@huawei.com
Fixes: 5bfbcd1 ("tracing/timerlat: Add interface_lock around clearing of kthread in stop_kthread()")
Signed-off-by: Wei Li <liwei391@huawei.com>
Signed-off-by: Steven Rostedt (Google) <rostedt@goodmis.org>1 parent 0bb0a5c commit b484a02
1 file changed
+6
-7
lines changed| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1953 | 1953 | | |
1954 | 1954 | | |
1955 | 1955 | | |
1956 | | - | |
1957 | | - | |
| 1956 | + | |
1958 | 1957 | | |
1959 | | - | |
1960 | | - | |
1961 | | - | |
1962 | 1958 | | |
1963 | 1959 | | |
1964 | 1960 | | |
| |||
1972 | 1968 | | |
1973 | 1969 | | |
1974 | 1970 | | |
1975 | | - | |
1976 | 1971 | | |
1977 | 1972 | | |
1978 | 1973 | | |
| |||
1994 | 1989 | | |
1995 | 1990 | | |
1996 | 1991 | | |
1997 | | - | |
| 1992 | + | |
| 1993 | + | |
| 1994 | + | |
1998 | 1995 | | |
| 1996 | + | |
| 1997 | + | |
1999 | 1998 | | |
2000 | 1999 | | |
2001 | 2000 | | |
| |||
0 commit comments