It makes nohz tracing more lightweight, standard and easier to parse. Examples:
user_loop-2904 [007] d..1 517.701126: tick_stop: success=1 dependency=NONE user_loop-2904 [007] dn.1 518.021181: tick_stop: success=0 dependency=SCHED posix_timers-6142 [007] d..1 1739.027400: tick_stop: success=0 dependency=POSIX_TIMER user_loop-5463 [007] dN.1 1185.931939: tick_stop: success=0 dependency=PERF_EVENTS Suggested-by: Peter Zijlstra <pet...@infradead.org> Cc: Christoph Lameter <c...@linux.com> Cc: Chris Metcalf <cmetc...@ezchip.com> Cc: Ingo Molnar <mi...@kernel.org> Cc: Luiz Capitulino <lcapitul...@redhat.com> Cc: Peter Zijlstra <pet...@infradead.org> Cc: Rik van Riel <r...@redhat.com> Cc: Thomas Gleixner <t...@linutronix.de> Cc: Viresh Kumar <viresh.ku...@linaro.org> Signed-off-by: Frederic Weisbecker <fweis...@gmail.com> --- include/linux/tick.h | 1 + include/trace/events/timer.h | 36 +++++++++++++++++++++++++++++++----- kernel/time/tick-sched.c | 18 +++++++++--------- 3 files changed, 41 insertions(+), 14 deletions(-) diff --git a/include/linux/tick.h b/include/linux/tick.h index 56c660e..6d09dc1 100644 --- a/include/linux/tick.h +++ b/include/linux/tick.h @@ -104,6 +104,7 @@ enum tick_dependency_bit { TICK_CLOCK_UNSTABLE_BIT = 3 }; +#define TICK_NONE_MASK 0 #define TICK_POSIX_TIMER_MASK (1 << TICK_POSIX_TIMER_BIT) #define TICK_PERF_EVENTS_MASK (1 << TICK_PERF_EVENTS_BIT) #define TICK_SCHED_MASK (1 << TICK_SCHED_BIT) diff --git a/include/trace/events/timer.h b/include/trace/events/timer.h index 073b9ac..2868fa5 100644 --- a/include/trace/events/timer.h +++ b/include/trace/events/timer.h @@ -328,23 +328,49 @@ TRACE_EVENT(itimer_expire, ); #ifdef CONFIG_NO_HZ_COMMON + +#define TICK_DEP_NAMES \ + tick_dep_name(NONE) \ + tick_dep_name(POSIX_TIMER) \ + tick_dep_name(PERF_EVENTS) \ + tick_dep_name(SCHED) \ + tick_dep_name_end(CLOCK_UNSTABLE) + +#undef tick_dep_name +#undef tick_dep_name_end + +#define tick_dep_name(sdep) TRACE_DEFINE_ENUM(TICK_##sdep##_MASK); +#define tick_dep_name_end(sdep) TRACE_DEFINE_ENUM(TICK_##sdep##_MASK); + +TICK_DEP_NAMES + +#undef tick_dep_name +#undef tick_dep_name_end + +#define tick_dep_name(sdep) { TICK_##sdep##_MASK, #sdep }, +#define tick_dep_name_end(sdep) { TICK_##sdep##_MASK, #sdep } + +#define show_tick_dep_name(val) \ + __print_symbolic(val, TICK_DEP_NAMES) + TRACE_EVENT(tick_stop, - TP_PROTO(int success, char *error_msg), + TP_PROTO(int success, int dependency), - TP_ARGS(success, error_msg), + TP_ARGS(success, dependency), TP_STRUCT__entry( __field( int , success ) - __string( msg, error_msg ) + __field( int , dependency ) ), TP_fast_assign( __entry->success = success; - __assign_str(msg, error_msg); + __entry->dependency = dependency; ), - TP_printk("success=%s msg=%s", __entry->success ? "yes" : "no", __get_str(msg)) + TP_printk("success=%d dependency=%s", __entry->success, \ + show_tick_dep_name(__entry->dependency)) ); #endif diff --git a/kernel/time/tick-sched.c b/kernel/time/tick-sched.c index 093b807..b3bd5c4 100644 --- a/kernel/time/tick-sched.c +++ b/kernel/time/tick-sched.c @@ -161,22 +161,22 @@ static unsigned long tick_dependency; static void trace_tick_dependency(unsigned long dep) { if (dep & TICK_POSIX_TIMER_MASK) { - trace_tick_stop(0, "posix timers running\n"); + trace_tick_stop(0, TICK_POSIX_TIMER_MASK); return; } if (dep & TICK_PERF_EVENTS_MASK) { - trace_tick_stop(0, "perf events running\n"); + trace_tick_stop(0, TICK_PERF_EVENTS_MASK); return; } if (dep & TICK_SCHED_MASK) { - trace_tick_stop(0, "more than 1 task in runqueue\n"); + trace_tick_stop(0, TICK_SCHED_MASK); return; } if (dep & TICK_CLOCK_UNSTABLE_MASK) - trace_tick_stop(0, "unstable sched clock\n"); + trace_tick_stop(0, TICK_CLOCK_UNSTABLE_MASK); } static bool can_stop_full_tick(struct tick_sched *ts) @@ -204,17 +204,17 @@ static bool can_stop_full_tick(struct tick_sched *ts) } if (!sched_can_stop_tick()) { - trace_tick_stop(0, "more than 1 task in runqueue\n"); + trace_tick_stop(0, TICK_SCHED_MASK); return false; } if (!posix_cpu_timers_can_stop_tick(current)) { - trace_tick_stop(0, "posix timers running\n"); + trace_tick_stop(0, TICK_POSIX_TIMER_MASK); return false; } if (!perf_event_can_stop_tick()) { - trace_tick_stop(0, "perf events running\n"); + trace_tick_stop(0, TICK_PERF_EVENTS_MASK); return false; } @@ -226,7 +226,7 @@ static bool can_stop_full_tick(struct tick_sched *ts) * sched_clock_stable is set. */ if (!sched_clock_stable()) { - trace_tick_stop(0, "unstable sched clock\n"); + trace_tick_stop(0, TICK_CLOCK_UNSTABLE_MASK); /* * Don't allow the user to think they can get * full NO_HZ with this machine. @@ -803,7 +803,7 @@ static ktime_t tick_nohz_stop_sched_tick(struct tick_sched *ts, ts->last_tick = hrtimer_get_expires(&ts->sched_timer); ts->tick_stopped = 1; - trace_tick_stop(1, " "); + trace_tick_stop(1, TICK_NONE_MASK); } /* -- 2.6.4 -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/