On Wed, 15 Jun 2016 13:18:21 -0700 Omar Sandoval <[email protected]> wrote:
> From: Omar Sandoval <[email protected]> > > This is exposed in debugfs but there's no quick way to set it with > trace-cmd. While we're adding support for this, fix --profile so it sets > max_graph_depth back to whatever it was before. > > Signed-off-by: Omar Sandoval <[email protected]> Hi! Thanks for the patch. I don't mind the long name, but I would also like a short cut version. Maybe use 'L'? (as mMgGdD are already used :-p) I may just pull this patch and add the shortcut myself. Thanks! -- Steve > --- > Documentation/trace-cmd-record.1.txt | 5 ++++ > trace-record.c | 52 > +++++++++++++++++++++++++++--------- > trace-usage.c | 1 + > 3 files changed, 45 insertions(+), 13 deletions(-) > > diff --git a/Documentation/trace-cmd-record.1.txt > b/Documentation/trace-cmd-record.1.txt > index d88050d87558..b80520e5e815 100644 > --- a/Documentation/trace-cmd-record.1.txt > +++ b/Documentation/trace-cmd-record.1.txt > @@ -263,6 +263,11 @@ OPTIONS > timestamp to gettimeofday which will allow wall time output from the > timestamps reading the created 'trace.dat' file. > > +*--max-graph-depth* 'depth':: > + Set the maximum depth the function_graph tracer will trace into a > function. > + A value of one will only show where userspace enters the kernel but not > any > + functions called in the kernel. The default is zero, which means no > limit. > + > *--profile*:: > With the *--profile* option, "trace-cmd" will enable tracing that can > be used with trace-cmd-report(1) --profile option. If a tracer *-p* is > diff --git a/trace-record.c b/trace-record.c > index 9f220c9c6330..fc124b7f1e98 100644 > --- a/trace-record.c > +++ b/trace-record.c > @@ -2180,6 +2180,20 @@ static void set_clock(struct buffer_instance *instance) > write_instance_file(instance, "trace_clock", instance->clock, "clock"); > } > > +static void set_max_graph_depth(struct buffer_instance *instance, char > *max_graph_depth) > +{ > + char *path; > + int ret; > + > + path = get_instance_file(instance, "max_graph_depth"); > + reset_save_file(path, RESET_DEFAULT_PRIO); > + tracecmd_put_tracing_file(path); > + ret = write_instance_file(instance, "max_graph_depth", max_graph_depth, > + NULL); > + if (ret < 0) > + die("could not write to max_graph_depth"); > +} > + > static struct event_list * > create_event(struct buffer_instance *instance, char *path, struct event_list > *old_event) > { > @@ -3993,7 +4007,6 @@ profile_add_event(struct buffer_instance *instance, > const char *event_str, int s > static void enable_profile(struct buffer_instance *instance) > { > int stacktrace = 0; > - int ret; > int i; > char *trigger_events[] = { > "sched:sched_switch", > @@ -4015,10 +4028,7 @@ static void enable_profile(struct buffer_instance > *instance) > if (!instance->plugin) { > if (trace_check_file_exists(instance, "max_graph_depth")) { > instance->plugin = "function_graph"; > - ret = write_instance_file(instance, "max_graph_depth", > - "1", NULL); > - if (ret < 0) > - die("could not write to max_graph_depth"); > + set_max_graph_depth(instance, "1"); > } else > warning("Kernel does not support max_graph_depth\n" > " Skipping user/kernel profiling"); > @@ -4103,14 +4113,16 @@ void update_first_instance(struct buffer_instance > *instance, int topt) > } > > enum { > - OPT_debug = 247, > - OPT_tsoffset = 249, > - OPT_bycomm = 250, > - OPT_stderr = 251, > - OPT_profile = 252, > - OPT_nosplice = 253, > - OPT_funcstack = 254, > - OPT_date = 255, > + > + OPT_debug = 247, > + OPT_max_graph_depth = 248, > + OPT_tsoffset = 249, > + OPT_bycomm = 250, > + OPT_stderr = 251, > + OPT_profile = 252, > + OPT_nosplice = 253, > + OPT_funcstack = 254, > + OPT_date = 255, > }; > > void trace_record (int argc, char **argv) > @@ -4140,6 +4152,7 @@ void trace_record (int argc, char **argv) > int neg_event = 0; > int date = 0; > int manual = 0; > + char *max_graph_depth = NULL; > int topt = 0; > int do_child = 0; > int data_flags = 0; > @@ -4311,6 +4324,7 @@ void trace_record (int argc, char **argv) > {"stderr", no_argument, NULL, OPT_stderr}, > {"by-comm", no_argument, NULL, OPT_bycomm}, > {"ts-offset", required_argument, NULL, OPT_tsoffset}, > + {"max-graph-depth", required_argument, NULL, > OPT_max_graph_depth}, > {"debug", no_argument, NULL, OPT_debug}, > {"help", no_argument, NULL, '?'}, > {NULL, 0, NULL, 0} > @@ -4574,6 +4588,12 @@ void trace_record (int argc, char **argv) > die("Can not use both --date and --ts-offset"); > data_flags |= DATA_FL_OFFSET; > break; > + case OPT_max_graph_depth: > + free(max_graph_depth); > + max_graph_depth = strdup(optarg); > + if (!max_graph_depth) > + die("Could not allocate option"); > + break; > case OPT_debug: > debug = 1; > break; > @@ -4691,6 +4711,12 @@ void trace_record (int argc, char **argv) > > set_options(); > > + if (max_graph_depth) { > + for_all_instances(instance) > + set_max_graph_depth(instance, max_graph_depth); > + free(max_graph_depth); > + } > + > allocate_seq(); > > if (type & (TRACE_TYPE_RECORD | TRACE_TYPE_STREAM)) { > diff --git a/trace-usage.c b/trace-usage.c > index b5304ef9fda1..5c1a69255581 100644 > --- a/trace-usage.c > +++ b/trace-usage.c > @@ -52,6 +52,7 @@ static struct usage_help usage_help[] = { > " --profile enable tracing options needed for report > --profile\n" > " --func-stack perform a stack trace for function > tracer\n" > " (use with caution)\n" > + " --max-graph-depth limit function_graph depth\n" > }, > { > "start",

