aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSteven Rostedt (Red Hat) <rostedt@goodmis.org>2016-06-17 17:40:58 -0400
committerSteven Rostedt <rostedt@goodmis.org>2016-06-20 09:54:21 -0400
commite947841c0dce9db675a957182214ef8091ac3d61 (patch)
tree8388467c005b99695103a85f03a9b21a6194b5b0
parentaad108aa9d1aca5be178ef40325dcc99b448e866 (diff)
tracing: Show the preempt count of when the event was called
Because tracepoint callbacks are done with preemption enabled, the trace events are always called with preempt disable due to the rcu_read_lock_sched_notrace() in __DO_TRACE(). This causes the preempt count shown in the recorded trace event to be inaccurate. It is always one more that what the preempt_count was when the tracepoint was called. If CONFIG_PREEMPT is enabled, subtract 1 from the preempt_count before recording it in the trace buffer. Link: http://lkml.kernel.org/r/20160525132537.GA10808@linutronix.de Reported-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
-rw-r--r--kernel/trace/trace_events.c8
1 files changed, 8 insertions, 0 deletions
diff --git a/kernel/trace/trace_events.c b/kernel/trace/trace_events.c
index fd449eb138cf..03c0a48c3ac4 100644
--- a/kernel/trace/trace_events.c
+++ b/kernel/trace/trace_events.c
@@ -261,6 +261,14 @@ void *trace_event_buffer_reserve(struct trace_event_buffer *fbuffer,
261 261
262 local_save_flags(fbuffer->flags); 262 local_save_flags(fbuffer->flags);
263 fbuffer->pc = preempt_count(); 263 fbuffer->pc = preempt_count();
264 /*
265 * If CONFIG_PREEMPT is enabled, then the tracepoint itself disables
266 * preemption (adding one to the preempt_count). Since we are
267 * interested in the preempt_count at the time the tracepoint was
268 * hit, we need to subtract one to offset the increment.
269 */
270 if (IS_ENABLED(CONFIG_PREEMPT))
271 fbuffer->pc--;
264 fbuffer->trace_file = trace_file; 272 fbuffer->trace_file = trace_file;
265 273
266 fbuffer->event = 274 fbuffer->event =