Browse Source

perf trace: Make --(min,max}-stack imply "--call-graph dwarf"

If one uses:

  # perf trace --min-stack 16

Then it implicitly means that callgraphs should be enabled, and the best
option in terms of widespread availability is "dwarf".

Further work needed to choose a better alternative, LBR, in capable
systems.

Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: David Ahern <dsahern@gmail.com>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Milian Wolff <milian.wolff@kdab.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Wang Nan <wangnan0@huawei.com>
Link: http://lkml.kernel.org/n/tip-xtjmnpkyk42npekxz3kynzmx@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Arnaldo Carvalho de Melo 9 years ago
parent
commit
0561499326
2 changed files with 18 additions and 1 deletions
  1. 6 0
      tools/perf/Documentation/perf-trace.txt
  2. 12 1
      tools/perf/builtin-trace.c

+ 6 - 0
tools/perf/Documentation/perf-trace.txt

@@ -136,12 +136,18 @@ the thread executes on the designated CPUs. Default is to monitor all CPUs.
         not limiting, the overhead of callchains needs to be set via the
         not limiting, the overhead of callchains needs to be set via the
         knobs in --call-graph dwarf.
         knobs in --call-graph dwarf.
 
 
+        Implies '--call-graph dwarf' when --call-graph not present on the
+        command line, on systems where DWARF unwinding was built in.
+
         Default: 127
         Default: 127
 
 
 --min-stack::
 --min-stack::
         Set the stack depth limit when parsing the callchain, anything
         Set the stack depth limit when parsing the callchain, anything
         below the specified depth will be ignored. Disabled by default.
         below the specified depth will be ignored. Disabled by default.
 
 
+        Implies '--call-graph dwarf' when --call-graph not present on the
+        command line, on systems where DWARF unwinding was built in.
+
 --proc-map-timeout::
 --proc-map-timeout::
 	When processing pre-existing threads /proc/XXX/mmap, it may take a long time,
 	When processing pre-existing threads /proc/XXX/mmap, it may take a long time,
 	because the file may be huge. A time out is needed in such cases.
 	because the file may be huge. A time out is needed in such cases.

+ 12 - 1
tools/perf/builtin-trace.c

@@ -3047,7 +3047,7 @@ int cmd_trace(int argc, const char **argv, const char *prefix __maybe_unused)
 		.show_comm = true,
 		.show_comm = true,
 		.trace_syscalls = true,
 		.trace_syscalls = true,
 		.kernel_syscallchains = false,
 		.kernel_syscallchains = false,
-		.max_stack = PERF_MAX_STACK_DEPTH,
+		.max_stack = UINT_MAX,
 	};
 	};
 	const char *output_name = NULL;
 	const char *output_name = NULL;
 	const char *ev_qualifier_str = NULL;
 	const char *ev_qualifier_str = NULL;
@@ -3109,6 +3109,7 @@ int cmd_trace(int argc, const char **argv, const char *prefix __maybe_unused)
 			"per thread proc mmap processing timeout in ms"),
 			"per thread proc mmap processing timeout in ms"),
 	OPT_END()
 	OPT_END()
 	};
 	};
+	bool max_stack_user_set = true;
 	const char * const trace_subcommands[] = { "record", NULL };
 	const char * const trace_subcommands[] = { "record", NULL };
 	int err;
 	int err;
 	char bf[BUFSIZ];
 	char bf[BUFSIZ];
@@ -3142,6 +3143,16 @@ int cmd_trace(int argc, const char **argv, const char *prefix __maybe_unused)
 		trace.opts.sample_time = true;
 		trace.opts.sample_time = true;
 	}
 	}
 
 
+	if (trace.max_stack == UINT_MAX) {
+		trace.max_stack = PERF_MAX_STACK_DEPTH;
+		max_stack_user_set = false;
+	}
+
+#ifdef HAVE_DWARF_UNWIND_SUPPORT
+	if ((trace.min_stack || max_stack_user_set) && !trace.opts.callgraph_set)
+		record_opts__parse_callchain(&trace.opts, &callchain_param, "dwarf", false);
+#endif
+
 	if (trace.opts.callgraph_set)
 	if (trace.opts.callgraph_set)
 		symbol_conf.use_callchain = true;
 		symbol_conf.use_callchain = true;