提交 e6e6cc22 编写于 作者: F Frederic Weisbecker

nohz: Use enum code for tick stop failure tracing message

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: NPeter Zijlstra <peterz@infradead.org>
Reviewed-by: NChris Metcalf <cmetcalf@ezchip.com>
Cc: Christoph Lameter <cl@linux.com>
Cc: Chris Metcalf <cmetcalf@ezchip.com>
Cc: Ingo Molnar <mingo@kernel.org>
Cc: Luiz Capitulino <lcapitulino@redhat.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Rik van Riel <riel@redhat.com>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Viresh Kumar <viresh.kumar@linaro.org>
Signed-off-by: NFrederic Weisbecker <fweisbec@gmail.com>
上级 d027d45d
...@@ -104,6 +104,7 @@ enum tick_dep_bits { ...@@ -104,6 +104,7 @@ enum tick_dep_bits {
TICK_DEP_BIT_CLOCK_UNSTABLE = 3 TICK_DEP_BIT_CLOCK_UNSTABLE = 3
}; };
#define TICK_DEP_MASK_NONE 0
#define TICK_DEP_MASK_POSIX_TIMER (1 << TICK_DEP_BIT_POSIX_TIMER) #define TICK_DEP_MASK_POSIX_TIMER (1 << TICK_DEP_BIT_POSIX_TIMER)
#define TICK_DEP_MASK_PERF_EVENTS (1 << TICK_DEP_BIT_PERF_EVENTS) #define TICK_DEP_MASK_PERF_EVENTS (1 << TICK_DEP_BIT_PERF_EVENTS)
#define TICK_DEP_MASK_SCHED (1 << TICK_DEP_BIT_SCHED) #define TICK_DEP_MASK_SCHED (1 << TICK_DEP_BIT_SCHED)
......
...@@ -328,23 +328,49 @@ TRACE_EVENT(itimer_expire, ...@@ -328,23 +328,49 @@ TRACE_EVENT(itimer_expire,
); );
#ifdef CONFIG_NO_HZ_COMMON #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_DEP_MASK_##sdep);
#define tick_dep_name_end(sdep) TRACE_DEFINE_ENUM(TICK_DEP_MASK_##sdep);
TICK_DEP_NAMES
#undef tick_dep_name
#undef tick_dep_name_end
#define tick_dep_name(sdep) { TICK_DEP_MASK_##sdep, #sdep },
#define tick_dep_name_end(sdep) { TICK_DEP_MASK_##sdep, #sdep }
#define show_tick_dep_name(val) \
__print_symbolic(val, TICK_DEP_NAMES)
TRACE_EVENT(tick_stop, 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( TP_STRUCT__entry(
__field( int , success ) __field( int , success )
__string( msg, error_msg ) __field( int , dependency )
), ),
TP_fast_assign( TP_fast_assign(
__entry->success = success; __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 #endif
......
...@@ -163,22 +163,22 @@ static unsigned long tick_dep_mask; ...@@ -163,22 +163,22 @@ static unsigned long tick_dep_mask;
static void trace_tick_dependency(unsigned long dep) static void trace_tick_dependency(unsigned long dep)
{ {
if (dep & TICK_DEP_MASK_POSIX_TIMER) { if (dep & TICK_DEP_MASK_POSIX_TIMER) {
trace_tick_stop(0, "posix timers running\n"); trace_tick_stop(0, TICK_DEP_MASK_POSIX_TIMER);
return; return;
} }
if (dep & TICK_DEP_MASK_PERF_EVENTS) { if (dep & TICK_DEP_MASK_PERF_EVENTS) {
trace_tick_stop(0, "perf events running\n"); trace_tick_stop(0, TICK_DEP_MASK_PERF_EVENTS);
return; return;
} }
if (dep & TICK_DEP_MASK_SCHED) { if (dep & TICK_DEP_MASK_SCHED) {
trace_tick_stop(0, "more than 1 task in runqueue\n"); trace_tick_stop(0, TICK_DEP_MASK_SCHED);
return; return;
} }
if (dep & TICK_DEP_MASK_CLOCK_UNSTABLE) if (dep & TICK_DEP_MASK_CLOCK_UNSTABLE)
trace_tick_stop(0, "unstable sched clock\n"); trace_tick_stop(0, TICK_DEP_MASK_CLOCK_UNSTABLE);
} }
static bool can_stop_full_tick(struct tick_sched *ts) static bool can_stop_full_tick(struct tick_sched *ts)
...@@ -206,17 +206,17 @@ static bool can_stop_full_tick(struct tick_sched *ts) ...@@ -206,17 +206,17 @@ static bool can_stop_full_tick(struct tick_sched *ts)
} }
if (!sched_can_stop_tick()) { if (!sched_can_stop_tick()) {
trace_tick_stop(0, "more than 1 task in runqueue\n"); trace_tick_stop(0, TICK_DEP_MASK_SCHED);
return false; return false;
} }
if (!posix_cpu_timers_can_stop_tick(current)) { if (!posix_cpu_timers_can_stop_tick(current)) {
trace_tick_stop(0, "posix timers running\n"); trace_tick_stop(0, TICK_DEP_MASK_POSIX_TIMER);
return false; return false;
} }
if (!perf_event_can_stop_tick()) { if (!perf_event_can_stop_tick()) {
trace_tick_stop(0, "perf events running\n"); trace_tick_stop(0, TICK_DEP_MASK_PERF_EVENTS);
return false; return false;
} }
...@@ -228,7 +228,7 @@ static bool can_stop_full_tick(struct tick_sched *ts) ...@@ -228,7 +228,7 @@ static bool can_stop_full_tick(struct tick_sched *ts)
* sched_clock_stable is set. * sched_clock_stable is set.
*/ */
if (!sched_clock_stable()) { if (!sched_clock_stable()) {
trace_tick_stop(0, "unstable sched clock\n"); trace_tick_stop(0, TICK_DEP_MASK_CLOCK_UNSTABLE);
/* /*
* Don't allow the user to think they can get * Don't allow the user to think they can get
* full NO_HZ with this machine. * full NO_HZ with this machine.
...@@ -821,7 +821,7 @@ static ktime_t tick_nohz_stop_sched_tick(struct tick_sched *ts, ...@@ -821,7 +821,7 @@ static ktime_t tick_nohz_stop_sched_tick(struct tick_sched *ts,
ts->last_tick = hrtimer_get_expires(&ts->sched_timer); ts->last_tick = hrtimer_get_expires(&ts->sched_timer);
ts->tick_stopped = 1; ts->tick_stopped = 1;
trace_tick_stop(1, " "); trace_tick_stop(1, TICK_DEP_MASK_NONE);
} }
/* /*
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册