All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v2] tracing/osnoise: Properly unhook events if start_per_cpu_kthreads() fails
@ 2022-01-09 15:34 Nikita Yushchenko
  2022-01-10  7:37 ` Daniel Bristot de Oliveira
  0 siblings, 1 reply; 2+ messages in thread
From: Nikita Yushchenko @ 2022-01-09 15:34 UTC (permalink / raw)
  To: Steven Rostedt, Daniel Bristot de Oliveira, Ingo Molnar
  Cc: linux-kernel, kernel

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.

Fixes: bce29ac9ce0b ("trace: Add osnoise tracer")
Signed-off-by: Nikita Yushchenko <nikita.yushchenko@virtuozzo.com>
---
Changes since v1:
- add barrier between clearing flag and unhooking events
- update subject and fix spelling in the commit message

 kernel/trace/trace_osnoise.c | 20 ++++++++++++++++----
 1 file changed, 16 insertions(+), 4 deletions(-)

diff --git a/kernel/trace/trace_osnoise.c b/kernel/trace/trace_osnoise.c
index 7520d43aed55..b58674e8644a 100644
--- a/kernel/trace/trace_osnoise.c
+++ b/kernel/trace/trace_osnoise.c
@@ -2123,6 +2123,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
  */
@@ -2155,7 +2162,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;
 	}
 
@@ -2186,9 +2200,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)
-- 
2.30.2


^ permalink raw reply related	[flat|nested] 2+ messages in thread

* Re: [PATCH v2] tracing/osnoise: Properly unhook events if start_per_cpu_kthreads() fails
  2022-01-09 15:34 [PATCH v2] tracing/osnoise: Properly unhook events if start_per_cpu_kthreads() fails Nikita Yushchenko
@ 2022-01-10  7:37 ` Daniel Bristot de Oliveira
  0 siblings, 0 replies; 2+ messages in thread
From: Daniel Bristot de Oliveira @ 2022-01-10  7:37 UTC (permalink / raw)
  To: Nikita Yushchenko, Steven Rostedt, Ingo Molnar; +Cc: linux-kernel, kernel

On 1/9/22 16:34, Nikita Yushchenko wrote:
> 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.
> 
> Fixes: bce29ac9ce0b ("trace: Add osnoise tracer")
> Signed-off-by: Nikita Yushchenko <nikita.yushchenko@virtuozzo.com>

Acked-by: Daniel Bristot de Oliveira <bristot@kernel.org>

Thanks Nikita!
-- Daniel

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2022-01-10  7:46 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-01-09 15:34 [PATCH v2] tracing/osnoise: Properly unhook events if start_per_cpu_kthreads() fails Nikita Yushchenko
2022-01-10  7:37 ` Daniel Bristot de Oliveira

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.