| From: "Steven Rostedt (Red Hat)" <rostedt@goodmis.org> |
| Date: Fri, 17 Jun 2016 17:40:58 -0400 |
| Subject: [PATCH] tracing: Show the preempt count of when the event was called |
| |
| Upstream commit e947841c0dce9db675a957182214ef8091ac3d61 |
| |
| 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> |
| Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> |
| --- |
| kernel/trace/trace_events.c | 8 ++++++++ |
| 1 file changed, 8 insertions(+) |
| |
| --- a/kernel/trace/trace_events.c |
| +++ b/kernel/trace/trace_events.c |
| @@ -244,6 +244,14 @@ void *trace_event_buffer_reserve(struct |
| |
| local_save_flags(fbuffer->flags); |
| fbuffer->pc = preempt_count(); |
| + /* |
| + * If CONFIG_PREEMPT is enabled, then the tracepoint itself disables |
| + * preemption (adding one to the preempt_count). Since we are |
| + * interested in the preempt_count at the time the tracepoint was |
| + * hit, we need to subtract one to offset the increment. |
| + */ |
| + if (IS_ENABLED(CONFIG_PREEMPT)) |
| + fbuffer->pc--; |
| fbuffer->trace_file = trace_file; |
| |
| fbuffer->event = |