FAILED: patch "[PATCH] tracing/osnoise: Properly unhook events if" failed to apply to 5.15-stable tree
Subsystems (3)
[email protected]
maintainerThe patch below does not apply to the 5.15-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From 0878355b51f5f26632e652c848a8e174bb02d22d Mon Sep 17 00:00:00 2001
From: Nikita Yushchenko <[email protected]>
Date: Sun, 9 Jan 2022 18:34:59 +0300
Subject: [PATCH] tracing/osnoise: Properly unhook events if
start_per_cpu_kthreads() fails
If start_per_cpu_kthreads() called from osnoise_workload_start() returns error, event hooks are left in broken state: unhook_irq_events() called but unhook_thread_events() and unhook_softirq_events() not called, and trace_osnoise_callback_enabled flag not cleared.
On the next tracer enable, hooks get not installed due to trace_osnoise_callback_enabled flag.
And on the further tracer disable an attempt to remove non-installed hooks happened, hitting a WARN_ON_ONCE() in tracepoint_remove_func().
Fix the error path by adding the missing part of cleanup. While at this, introduce osnoise_unhook_events() to avoid code duplication between this error path and normal tracer disable.
kernel/trace/trace_osnoise.c +16 -4
@@ -2122,6 +2122,13 @@ static int osnoise_hook_events(void)return -EINVAL ; } +static void osnoise_unhook_events (void ) +{ +unhook_thread_events (); +unhook_softirq_events (); +unhook_irq_events (); +} +/* * osnoise_workload_start - start the workload and hook to events */
@@ -2154,7 +2161,14 @@ static int osnoise_workload_start(void) retval =start_per_cpu_kthreads ();if (retval) { -unhook_irq_events (); + trace_osnoise_callback_enabled = false; +/* +* Make sure that ftrace_nmi_enter/exit() see +* trace_osnoise_callback_enabled as false before continuing. +*/ +barrier (); + +osnoise_unhook_events ();return retval; }
@@ -2185,9 +2199,7 @@ static void osnoise_workload_stop(void)stop_per_cpu_kthreads (); -unhook_irq_events (); -unhook_softirq_events (); -unhook_thread_events (); +osnoise_unhook_events (); }static void osnoise_tracer_start (struct trace_array *tr)
PATCH 1/1 tracing/osnoise: Properly unhook events if start_per_cpu_kthreads() fails
commit 0878355b51f5f26632e652c848a8e174bb02d22d upstream.
If start_per_cpu_kthreads() called from osnoise_workload_start() returns error, event hooks are left in broken state: unhook_irq_events() called but unhook_thread_events() and unhook_softirq_events() not called, and trace_osnoise_callback_enabled flag not cleared.
On the next tracer enable, hooks get not installed due to trace_osnoise_callback_enabled flag.
And on the further tracer disable an attempt to remove non-installed hooks happened, hitting a WARN_ON_ONCE() in tracepoint_remove_func().
Fix the error path by adding the missing part of cleanup. While at this, introduce osnoise_unhook_events() to avoid code duplication between this error path and normal tracer disable.
--- kernel/trace/trace_osnoise.c | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-)
kernel/trace/trace_osnoise.c +16 -4
@@ -1932,6 +1932,13 @@ static int osnoise_hook_events(void)return -EINVAL ; } +static void osnoise_unhook_events (void ) +{ +unhook_thread_events (); +unhook_softirq_events (); +unhook_irq_events (); +} +static int __osnoise_tracer_start (struct trace_array *tr) {int retval;
@@ -1949,7 +1956,14 @@ static int __osnoise_tracer_start(struct trace_array *tr) retval =start_per_cpu_kthreads (tr);if (retval) { -unhook_irq_events (); + trace_osnoise_callback_enabled = false; +/* +* Make sure that ftrace_nmi_enter/exit() see +* trace_osnoise_callback_enabled as false before continuing. +*/ +barrier (); + +osnoise_unhook_events ();return retval; }
@@ -1981,9 +1995,7 @@ static void osnoise_tracer_stop(struct trace_array *tr)stop_per_cpu_kthreads (); -unhook_irq_events (); -unhook_softirq_events (); -unhook_thread_events (); +osnoise_unhook_events (); osnoise_busy = false; }
Signature · 1 line
2.30.2
Greg KH
maintainerRe: [PATCH 5.15.y] tracing/osnoise: Properly unhook events if start_per_cpu_kthreads() fails
Quoted 19 lines · Nikita Yushchenko
commit
0878355b51f5f26632e652c848a8e174bb02d22dupstream.If
start_per_cpu_kthreads()called fromosnoise_workload_start()returns error, event hooks are left in broken state:unhook_irq_events()called butunhook_thread_events()andunhook_softirq_events()not called, andtrace_osnoise_callback_enabledflag not cleared.On the next tracer enable, hooks get not installed due to
trace_osnoise_callback_enabledflag.And on the further tracer disable an attempt to remove non-installed hooks happened, hitting a
WARN_ON_ONCE()intracepoint_remove_func().Fix the error path by adding the missing part of cleanup. While at this, introduce
osnoise_unhook_events()to avoid code duplication between this error path and normal tracer disable.
Quoted 8 lines
Fixes bce29ac9ce0b ("trace: Add osnoise tracer")Signed-off-by Nikita Yushchenko <[email protected]>Signed-off-by Steven Rostedt <[email protected]>--- kernel/trace/trace_osnoise.c | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-)
Now queued up, thanks.
greg k-h