mirror of https://gitee.com/openkylin/linux.git
tracing: Rearrange functions in trace_sched_wakeup.c
Rearrange the functions in trace_sched_wakeup.c so that there are fewer #ifdef CONFIG_FUNCTION_TRACER and #ifdef CONFIG_FUNCTION_GRAPH_TRACER, instead of having the #ifdefs spread all over. No functional change is made. Signed-off-by: Steven Rostedt (VMware) <rostedt@goodmis.org>
This commit is contained in:
parent
e73e679f65
commit
317e04ca90
|
@ -35,26 +35,19 @@ static arch_spinlock_t wakeup_lock =
|
||||||
|
|
||||||
static void wakeup_reset(struct trace_array *tr);
|
static void wakeup_reset(struct trace_array *tr);
|
||||||
static void __wakeup_reset(struct trace_array *tr);
|
static void __wakeup_reset(struct trace_array *tr);
|
||||||
|
static int start_func_tracer(struct trace_array *tr, int graph);
|
||||||
|
static void stop_func_tracer(struct trace_array *tr, int graph);
|
||||||
|
|
||||||
static int save_flags;
|
static int save_flags;
|
||||||
|
|
||||||
#ifdef CONFIG_FUNCTION_GRAPH_TRACER
|
#ifdef CONFIG_FUNCTION_GRAPH_TRACER
|
||||||
static int wakeup_display_graph(struct trace_array *tr, int set);
|
|
||||||
# define is_graph(tr) ((tr)->trace_flags & TRACE_ITER_DISPLAY_GRAPH)
|
# define is_graph(tr) ((tr)->trace_flags & TRACE_ITER_DISPLAY_GRAPH)
|
||||||
#else
|
#else
|
||||||
static inline int wakeup_display_graph(struct trace_array *tr, int set)
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
# define is_graph(tr) false
|
# define is_graph(tr) false
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
#ifdef CONFIG_FUNCTION_TRACER
|
#ifdef CONFIG_FUNCTION_TRACER
|
||||||
|
|
||||||
static int wakeup_graph_entry(struct ftrace_graph_ent *trace);
|
|
||||||
static void wakeup_graph_return(struct ftrace_graph_ret *trace);
|
|
||||||
|
|
||||||
static bool function_enabled;
|
static bool function_enabled;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -104,122 +97,8 @@ func_prolog_preempt_disable(struct trace_array *tr,
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* wakeup uses its own tracer function to keep the overhead down:
|
|
||||||
*/
|
|
||||||
static void
|
|
||||||
wakeup_tracer_call(unsigned long ip, unsigned long parent_ip,
|
|
||||||
struct ftrace_ops *op, struct pt_regs *pt_regs)
|
|
||||||
{
|
|
||||||
struct trace_array *tr = wakeup_trace;
|
|
||||||
struct trace_array_cpu *data;
|
|
||||||
unsigned long flags;
|
|
||||||
int pc;
|
|
||||||
|
|
||||||
if (!func_prolog_preempt_disable(tr, &data, &pc))
|
|
||||||
return;
|
|
||||||
|
|
||||||
local_irq_save(flags);
|
|
||||||
trace_function(tr, ip, parent_ip, flags, pc);
|
|
||||||
local_irq_restore(flags);
|
|
||||||
|
|
||||||
atomic_dec(&data->disabled);
|
|
||||||
preempt_enable_notrace();
|
|
||||||
}
|
|
||||||
|
|
||||||
static int register_wakeup_function(struct trace_array *tr, int graph, int set)
|
|
||||||
{
|
|
||||||
int ret;
|
|
||||||
|
|
||||||
/* 'set' is set if TRACE_ITER_FUNCTION is about to be set */
|
|
||||||
if (function_enabled || (!set && !(tr->trace_flags & TRACE_ITER_FUNCTION)))
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
if (graph)
|
|
||||||
ret = register_ftrace_graph(&wakeup_graph_return,
|
|
||||||
&wakeup_graph_entry);
|
|
||||||
else
|
|
||||||
ret = register_ftrace_function(tr->ops);
|
|
||||||
|
|
||||||
if (!ret)
|
|
||||||
function_enabled = true;
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void unregister_wakeup_function(struct trace_array *tr, int graph)
|
|
||||||
{
|
|
||||||
if (!function_enabled)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (graph)
|
|
||||||
unregister_ftrace_graph();
|
|
||||||
else
|
|
||||||
unregister_ftrace_function(tr->ops);
|
|
||||||
|
|
||||||
function_enabled = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int wakeup_function_set(struct trace_array *tr, u32 mask, int set)
|
|
||||||
{
|
|
||||||
if (!(mask & TRACE_ITER_FUNCTION))
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
if (set)
|
|
||||||
register_wakeup_function(tr, is_graph(tr), 1);
|
|
||||||
else
|
|
||||||
unregister_wakeup_function(tr, is_graph(tr));
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
static int register_wakeup_function(struct trace_array *tr, int graph, int set)
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
static void unregister_wakeup_function(struct trace_array *tr, int graph) { }
|
|
||||||
static int wakeup_function_set(struct trace_array *tr, u32 mask, int set)
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
#endif /* CONFIG_FUNCTION_TRACER */
|
|
||||||
|
|
||||||
static int wakeup_flag_changed(struct trace_array *tr, u32 mask, int set)
|
|
||||||
{
|
|
||||||
struct tracer *tracer = tr->current_trace;
|
|
||||||
|
|
||||||
if (wakeup_function_set(tr, mask, set))
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
#ifdef CONFIG_FUNCTION_GRAPH_TRACER
|
#ifdef CONFIG_FUNCTION_GRAPH_TRACER
|
||||||
if (mask & TRACE_ITER_DISPLAY_GRAPH)
|
|
||||||
return wakeup_display_graph(tr, set);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
return trace_keep_overwrite(tracer, mask, set);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int start_func_tracer(struct trace_array *tr, int graph)
|
|
||||||
{
|
|
||||||
int ret;
|
|
||||||
|
|
||||||
ret = register_wakeup_function(tr, graph, 0);
|
|
||||||
|
|
||||||
if (!ret && tracing_is_enabled())
|
|
||||||
tracer_enabled = 1;
|
|
||||||
else
|
|
||||||
tracer_enabled = 0;
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void stop_func_tracer(struct trace_array *tr, int graph)
|
|
||||||
{
|
|
||||||
tracer_enabled = 0;
|
|
||||||
|
|
||||||
unregister_wakeup_function(tr, graph);
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef CONFIG_FUNCTION_GRAPH_TRACER
|
|
||||||
static int wakeup_display_graph(struct trace_array *tr, int set)
|
static int wakeup_display_graph(struct trace_array *tr, int set)
|
||||||
{
|
{
|
||||||
if (!(is_graph(tr) ^ set))
|
if (!(is_graph(tr) ^ set))
|
||||||
|
@ -318,6 +197,107 @@ static void wakeup_print_header(struct seq_file *s)
|
||||||
else
|
else
|
||||||
trace_default_header(s);
|
trace_default_header(s);
|
||||||
}
|
}
|
||||||
|
#else /* CONFIG_FUNCTION_GRAPH_TRACER */
|
||||||
|
static int wakeup_graph_entry(struct ftrace_graph_ent *trace)
|
||||||
|
{
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
static void wakeup_graph_return(struct ftrace_graph_ret *trace) { }
|
||||||
|
#endif /* else CONFIG_FUNCTION_GRAPH_TRACER */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* wakeup uses its own tracer function to keep the overhead down:
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
wakeup_tracer_call(unsigned long ip, unsigned long parent_ip,
|
||||||
|
struct ftrace_ops *op, struct pt_regs *pt_regs)
|
||||||
|
{
|
||||||
|
struct trace_array *tr = wakeup_trace;
|
||||||
|
struct trace_array_cpu *data;
|
||||||
|
unsigned long flags;
|
||||||
|
int pc;
|
||||||
|
|
||||||
|
if (!func_prolog_preempt_disable(tr, &data, &pc))
|
||||||
|
return;
|
||||||
|
|
||||||
|
local_irq_save(flags);
|
||||||
|
trace_function(tr, ip, parent_ip, flags, pc);
|
||||||
|
local_irq_restore(flags);
|
||||||
|
|
||||||
|
atomic_dec(&data->disabled);
|
||||||
|
preempt_enable_notrace();
|
||||||
|
}
|
||||||
|
|
||||||
|
static int register_wakeup_function(struct trace_array *tr, int graph, int set)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
/* 'set' is set if TRACE_ITER_FUNCTION is about to be set */
|
||||||
|
if (function_enabled || (!set && !(tr->trace_flags & TRACE_ITER_FUNCTION)))
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
if (graph)
|
||||||
|
ret = register_ftrace_graph(&wakeup_graph_return,
|
||||||
|
&wakeup_graph_entry);
|
||||||
|
else
|
||||||
|
ret = register_ftrace_function(tr->ops);
|
||||||
|
|
||||||
|
if (!ret)
|
||||||
|
function_enabled = true;
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void unregister_wakeup_function(struct trace_array *tr, int graph)
|
||||||
|
{
|
||||||
|
if (!function_enabled)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (graph)
|
||||||
|
unregister_ftrace_graph();
|
||||||
|
else
|
||||||
|
unregister_ftrace_function(tr->ops);
|
||||||
|
|
||||||
|
function_enabled = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int wakeup_function_set(struct trace_array *tr, u32 mask, int set)
|
||||||
|
{
|
||||||
|
if (!(mask & TRACE_ITER_FUNCTION))
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
if (set)
|
||||||
|
register_wakeup_function(tr, is_graph(tr), 1);
|
||||||
|
else
|
||||||
|
unregister_wakeup_function(tr, is_graph(tr));
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
#else /* CONFIG_FUNCTION_TRACER */
|
||||||
|
static int register_wakeup_function(struct trace_array *tr, int graph, int set)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
static void unregister_wakeup_function(struct trace_array *tr, int graph) { }
|
||||||
|
static int wakeup_function_set(struct trace_array *tr, u32 mask, int set)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
#endif /* else CONFIG_FUNCTION_TRACER */
|
||||||
|
|
||||||
|
#ifndef CONFIG_FUNCTION_GRAPH_TRACER
|
||||||
|
static enum print_line_t wakeup_print_line(struct trace_iterator *iter)
|
||||||
|
{
|
||||||
|
return TRACE_TYPE_UNHANDLED;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void wakeup_trace_open(struct trace_iterator *iter) { }
|
||||||
|
static void wakeup_trace_close(struct trace_iterator *iter) { }
|
||||||
|
|
||||||
|
static void wakeup_print_header(struct seq_file *s)
|
||||||
|
{
|
||||||
|
trace_default_header(s);
|
||||||
|
}
|
||||||
|
#endif /* !CONFIG_FUNCTION_GRAPH_TRACER */
|
||||||
|
|
||||||
static void
|
static void
|
||||||
__trace_function(struct trace_array *tr,
|
__trace_function(struct trace_array *tr,
|
||||||
|
@ -329,34 +309,42 @@ __trace_function(struct trace_array *tr,
|
||||||
else
|
else
|
||||||
trace_function(tr, ip, parent_ip, flags, pc);
|
trace_function(tr, ip, parent_ip, flags, pc);
|
||||||
}
|
}
|
||||||
#else
|
|
||||||
#define __trace_function trace_function
|
|
||||||
|
|
||||||
static enum print_line_t wakeup_print_line(struct trace_iterator *iter)
|
static int wakeup_flag_changed(struct trace_array *tr, u32 mask, int set)
|
||||||
{
|
{
|
||||||
return TRACE_TYPE_UNHANDLED;
|
struct tracer *tracer = tr->current_trace;
|
||||||
|
|
||||||
|
if (wakeup_function_set(tr, mask, set))
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
#ifdef CONFIG_FUNCTION_GRAPH_TRACER
|
||||||
|
if (mask & TRACE_ITER_DISPLAY_GRAPH)
|
||||||
|
return wakeup_display_graph(tr, set);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return trace_keep_overwrite(tracer, mask, set);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void wakeup_trace_open(struct trace_iterator *iter) { }
|
static int start_func_tracer(struct trace_array *tr, int graph)
|
||||||
static void wakeup_trace_close(struct trace_iterator *iter) { }
|
{
|
||||||
|
int ret;
|
||||||
|
|
||||||
#ifdef CONFIG_FUNCTION_TRACER
|
ret = register_wakeup_function(tr, graph, 0);
|
||||||
static int wakeup_graph_entry(struct ftrace_graph_ent *trace)
|
|
||||||
{
|
if (!ret && tracing_is_enabled())
|
||||||
return -1;
|
tracer_enabled = 1;
|
||||||
|
else
|
||||||
|
tracer_enabled = 0;
|
||||||
|
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
static void wakeup_graph_return(struct ftrace_graph_ret *trace) { }
|
|
||||||
static void wakeup_print_header(struct seq_file *s)
|
static void stop_func_tracer(struct trace_array *tr, int graph)
|
||||||
{
|
{
|
||||||
trace_default_header(s);
|
tracer_enabled = 0;
|
||||||
|
|
||||||
|
unregister_wakeup_function(tr, graph);
|
||||||
}
|
}
|
||||||
#else
|
|
||||||
static void wakeup_print_header(struct seq_file *s)
|
|
||||||
{
|
|
||||||
trace_latency_header(s);
|
|
||||||
}
|
|
||||||
#endif /* CONFIG_FUNCTION_TRACER */
|
|
||||||
#endif /* CONFIG_FUNCTION_GRAPH_TRACER */
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Should this new latency be reported/recorded?
|
* Should this new latency be reported/recorded?
|
||||||
|
|
Loading…
Reference in New Issue