linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] trace-cmd record: add --max-graph-depth option
@ 2016-06-15 20:18 Omar Sandoval
  2016-06-16 15:14 ` Steven Rostedt
  0 siblings, 1 reply; 4+ messages in thread
From: Omar Sandoval @ 2016-06-15 20:18 UTC (permalink / raw)
  To: Steven Rostedt; +Cc: linux-kernel, kernel-team

From: Omar Sandoval <osandov@fb.com>

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 <osandov@fb.com>
---
 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",
-- 
2.8.3

^ permalink raw reply related	[flat|nested] 4+ messages in thread

* Re: [PATCH] trace-cmd record: add --max-graph-depth option
  2016-06-15 20:18 [PATCH] trace-cmd record: add --max-graph-depth option Omar Sandoval
@ 2016-06-16 15:14 ` Steven Rostedt
  2016-06-17 16:13   ` Steven Rostedt
  0 siblings, 1 reply; 4+ messages in thread
From: Steven Rostedt @ 2016-06-16 15:14 UTC (permalink / raw)
  To: Omar Sandoval; +Cc: linux-kernel, kernel-team

On Wed, 15 Jun 2016 13:18:21 -0700
Omar Sandoval <osandov@osandov.com> wrote:

> From: Omar Sandoval <osandov@fb.com>
> 
> 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 <osandov@fb.com>

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",

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH] trace-cmd record: add --max-graph-depth option
  2016-06-16 15:14 ` Steven Rostedt
@ 2016-06-17 16:13   ` Steven Rostedt
  2016-06-17 17:52     ` Omar Sandoval
  0 siblings, 1 reply; 4+ messages in thread
From: Steven Rostedt @ 2016-06-17 16:13 UTC (permalink / raw)
  To: Omar Sandoval; +Cc: linux-kernel, kernel-team

On Thu, 16 Jun 2016 11:14:10 -0400
Steven Rostedt <rostedt@goodmis.org> wrote:

> On Wed, 15 Jun 2016 13:18:21 -0700
> Omar Sandoval <osandov@osandov.com> wrote:
> 
> > From: Omar Sandoval <osandov@fb.com>
> > 
> > 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 <osandov@fb.com>  
> 

I applied it, will probably push it out sometime next week.

Thanks!

-- Steve

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH] trace-cmd record: add --max-graph-depth option
  2016-06-17 16:13   ` Steven Rostedt
@ 2016-06-17 17:52     ` Omar Sandoval
  0 siblings, 0 replies; 4+ messages in thread
From: Omar Sandoval @ 2016-06-17 17:52 UTC (permalink / raw)
  To: Steven Rostedt; +Cc: linux-kernel, kernel-team

On Fri, Jun 17, 2016 at 12:13:22PM -0400, Steven Rostedt wrote:
> On Thu, 16 Jun 2016 11:14:10 -0400
> Steven Rostedt <rostedt@goodmis.org> wrote:
> 
> > On Wed, 15 Jun 2016 13:18:21 -0700
> > Omar Sandoval <osandov@osandov.com> wrote:
> > 
> > > From: Omar Sandoval <osandov@fb.com>
> > > 
> > > 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 <osandov@fb.com>  
> > 
> 
> I applied it, will probably push it out sometime next week.
> 
> Thanks!
> 
> -- Steve

Thanks, Steve, I'll keep an eye out for it.

-- 
Omar

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2016-06-17 17:52 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2016-06-15 20:18 [PATCH] trace-cmd record: add --max-graph-depth option Omar Sandoval
2016-06-16 15:14 ` Steven Rostedt
2016-06-17 16:13   ` Steven Rostedt
2016-06-17 17:52     ` Omar Sandoval

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).