tracing/fgraph: Simplify return address printing in function graph tracer
Subsystems (3)
Masami Hiramatsu (Google)
maintainerPATCH v2 1/1 tracing/fgraph: Simplify return address printing in function graph tracer
From: Masami Hiramatsu (Google) <[email protected]>
Simplify return address printing in the function graph tracer by removing fgraph_extras. Since this feature is only used by the function graph tracer and the feature flags can directly accessible from the function graph tracer, fgraph_extras can be removed from the fgraph callback.
Signed-off-by Masami Hiramatsu (Google) <[email protected]>
---
Changes in v2:
- Remove graph_tracer_flags_get() since it is not used.
--- include/linux/ftrace.h | 16 ++---------- kernel/trace/fgraph.c | 45 ++++++++++++++++++++++------------ kernel/trace/ftrace.c | 3 +- kernel/trace/trace.h | 3 +- kernel/trace/trace_functions_graph.c | 18 +++++++------- kernel/trace/trace_irqsoff.c | 3 +- kernel/trace/trace_sched_wakeup.c | 3 +- kernel/trace/trace_selftest.c | 8 ++---- 8 files changed, 48 insertions(+), 51 deletions(-)
include/linux/ftrace.h +3 -13
@@ -1068,29 +1068,20 @@ struct ftrace_graph_ret {unsigned long long rettime; } __packed; -struct fgraph_extras ;struct fgraph_ops ;/* Type of the callback handlers for tracing function graph*/ typedef void (*trace_func_graph_ret_t )(struct ftrace_graph_ret *,struct fgraph_ops *);/* return */ typedef int (*trace_func_graph_ent_t )(struct ftrace_graph_ent *, -struct fgraph_ops *, -struct fgraph_extras *);/* entry */ +struct fgraph_ops *);/* entry */ extern int ftrace_graph_entry_stub (struct ftrace_graph_ent *trace, -struct fgraph_ops *gops, -struct fgraph_extras *extras); +struct fgraph_ops *gops);bool ftrace_pids_enabled (struct ftrace_ops *ops); #ifdef CONFIG_FUNCTION_GRAPH_TRACER -/* Used to convey some extra datas when creating a graph entry */ -struct fgraph_extras { - u32 flags; - unsigned long retaddr; -}; - struct fgraph_ops { trace_func_graph_ent_t entryfunc; trace_func_graph_ret_t retfunc;
@@ -1131,13 +1122,12 @@ function_graph_enter(unsigned long ret, unsigned long func,struct ftrace_ret_stack *ftrace_graph_get_ret_stack (struct task_struct *task,int skip); +unsigned long ftrace_graph_top_ret_addr (struct task_struct *task);unsigned long ftrace_graph_ret_addr (struct task_struct *task,int *idx,unsigned long ret,unsigned long *retp);unsigned long *fgraph_get_task_var (struct fgraph_ops *gops); -u32 graph_tracer_flags_get (u32 flags); -/* * Sometimes we don't want to trace a function with the function * graph tracer but we want them to keep traced by the usual function
kernel/trace/fgraph.c +29 -16
100 lines not on this page · raw message
kernel/trace/ftrace.c +1 -2
@@ -827,8 +827,7 @@ struct profile_fgraph_data { };static int profile_graph_entry (struct ftrace_graph_ent *trace, -struct fgraph_ops *gops, -struct fgraph_extras *extras) +struct fgraph_ops *gops) {struct profile_fgraph_data *profile_data;
kernel/trace/trace.h +1 -2
@@ -695,8 +695,7 @@ void trace_default_header(struct seq_file *m);void print_trace_header (struct seq_file *m,struct trace_iterator *iter);void trace_graph_return (struct ftrace_graph_ret *trace,struct fgraph_ops *gops); -int trace_graph_entry (struct ftrace_graph_ent *trace,struct fgraph_ops *gops, -struct fgraph_extras *extras); +int trace_graph_entry (struct ftrace_graph_ent *trace,struct fgraph_ops *gops);void tracing_start_cmdline_record (void );void tracing_stop_cmdline_record (void );
kernel/trace/trace_functions_graph.c +9 -9
@@ -90,9 +90,9 @@ static struct tracer_flags tracer_flags = { .opts = trace_opts }; -u32 graph_tracer_flags_get (u32 flags) +static bool tracer_flags_is_set (u32 flags) { -return tracer_flags.val & flags; +return (tracer_flags.val & flags) == flags; }/*
@@ -179,8 +179,7 @@ struct fgraph_times { };int trace_graph_entry (struct ftrace_graph_ent *trace, -struct fgraph_ops *gops, -struct fgraph_extras *extras) +struct fgraph_ops *gops) {unsigned long *task_var =fgraph_get_task_var (gops);struct trace_array *tr = gops->private;
@@ -246,11 +245,12 @@ int trace_graph_entry(struct ftrace_graph_ent *trace, disabled =atomic_inc_return (&data->disabled);if (likely (disabled ==1 )) { trace_ctx =tracing_gen_ctx_flags (flags); -if (unlikely (IS_ENABLED (CONFIG_FUNCTION_GRAPH_RETADDR ) && extras - && (extras->flags &TRACE_GRAPH_PRINT_RETADDR ))) - ret =__trace_graph_retaddr_entry (tr, trace, trace_ctx, - extras->retaddr); -else +if (unlikely (IS_ENABLED (CONFIG_FUNCTION_GRAPH_RETADDR ) && +tracer_flags_is_set (TRACE_GRAPH_PRINT_RETADDR ))) { +unsigned long retaddr =ftrace_graph_top_ret_addr (current); + + ret =__trace_graph_retaddr_entry (tr, trace, trace_ctx, retaddr); + }else ret =__trace_graph_entry (tr, trace, trace_ctx); }else { ret =0 ;
kernel/trace/trace_irqsoff.c +1 -2
@@ -176,8 +176,7 @@ static int irqsoff_display_graph(struct trace_array *tr, int set) }static int irqsoff_graph_entry (struct ftrace_graph_ent *trace, -struct fgraph_ops *gops, -struct fgraph_extras *extras) +struct fgraph_ops *gops) {struct trace_array *tr = irqsoff_trace;struct trace_array_cpu *data;
kernel/trace/trace_sched_wakeup.c +1 -2
@@ -113,8 +113,7 @@ static int wakeup_display_graph(struct trace_array *tr, int set) }static int wakeup_graph_entry (struct ftrace_graph_ent *trace, -struct fgraph_ops *gops, -struct fgraph_extras *extras) +struct fgraph_ops *gops) {struct trace_array *tr = wakeup_trace;struct trace_array_cpu *data;
kernel/trace/trace_selftest.c +3 -5
@@ -774,8 +774,7 @@ struct fgraph_fixture { };static __init int store_entry (struct ftrace_graph_ent *trace, -struct fgraph_ops *gops, -struct fgraph_extras *extras) +struct fgraph_ops *gops) { struct fgraph_fixture *fixture = container_of(gops, struct fgraph_fixture, gops);const char *type = fixture->store_type_name;
@@ -1026,8 +1025,7 @@ static unsigned int graph_hang_thresh;/* Wrap the real function entry probe to avoid possible hanging */ static int trace_graph_entry_watchdog (struct ftrace_graph_ent *trace, -struct fgraph_ops *gops, -struct fgraph_extras *extras) +struct fgraph_ops *gops) {/* This is harmlessly racy, we want to approximately detect a hang */ if (unlikely (++graph_hang_thresh >GRAPH_MAX_FUNC_TEST )) {
@@ -1041,7 +1039,7 @@ static int trace_graph_entry_watchdog(struct ftrace_graph_ent *trace,return 0 ; } -return trace_graph_entry (trace, gops,NULL ); +return trace_graph_entry (trace, gops); }static struct fgraph_ops fgraph_ops__initdata = {