浏览代码

perf record: Add --buildid-all option

The --buildid-all option is to record build-id of all DSOs in the file.
It might be very costly to postprocess samples to find which DSO hits.

Signed-off-by: Namhyung Kim <namhyung@kernel.org>
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: Andi Kleen <andi@firstfloor.org>
Cc: David Ahern <dsahern@gmail.com>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/r/1452519429-31779-1-git-send-email-namhyung@kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Namhyung Kim 9 年之前
父节点
当前提交
6156681b73
共有 2 个文件被更改,包括 23 次插入6 次删除
  1. 3 0
      tools/perf/Documentation/perf-record.txt
  2. 20 6
      tools/perf/builtin-record.c

+ 3 - 0
tools/perf/Documentation/perf-record.txt

@@ -338,6 +338,9 @@ Options passed to clang when compiling BPF scriptlets.
 Specify vmlinux path which has debuginfo.
 Specify vmlinux path which has debuginfo.
 (enabled when BPF prologue is on)
 (enabled when BPF prologue is on)
 
 
+--buildid-all::
+Record build-id of all DSOs regardless whether it's actually hit or not.
+
 SEE ALSO
 SEE ALSO
 --------
 --------
 linkperf:perf-stat[1], linkperf:perf-list[1]
 linkperf:perf-stat[1], linkperf:perf-list[1]

+ 20 - 6
tools/perf/builtin-record.c

@@ -50,6 +50,7 @@ struct record {
 	int			realtime_prio;
 	int			realtime_prio;
 	bool			no_buildid;
 	bool			no_buildid;
 	bool			no_buildid_cache;
 	bool			no_buildid_cache;
+	bool			buildid_all;
 	unsigned long long	samples;
 	unsigned long long	samples;
 };
 };
 
 
@@ -362,6 +363,13 @@ static int process_buildids(struct record *rec)
 	 */
 	 */
 	symbol_conf.ignore_vmlinux_buildid = true;
 	symbol_conf.ignore_vmlinux_buildid = true;
 
 
+	/*
+	 * If --buildid-all is given, it marks all DSO regardless of hits,
+	 * so no need to process samples.
+	 */
+	if (rec->buildid_all)
+		rec->tool.sample = NULL;
+
 	return perf_session__process_events(session);
 	return perf_session__process_events(session);
 }
 }
 
 
@@ -756,12 +764,8 @@ out_child:
 
 
 		if (!rec->no_buildid) {
 		if (!rec->no_buildid) {
 			process_buildids(rec);
 			process_buildids(rec);
-			/*
-			 * We take all buildids when the file contains
-			 * AUX area tracing data because we do not decode the
-			 * trace because it would take too long.
-			 */
-			if (rec->opts.full_auxtrace)
+
+			if (rec->buildid_all)
 				dsos__hit_all(rec->session);
 				dsos__hit_all(rec->session);
 		}
 		}
 		perf_session__write_header(rec->session, rec->evlist, fd, true);
 		perf_session__write_header(rec->session, rec->evlist, fd, true);
@@ -1138,6 +1142,8 @@ struct option __record_options[] = {
 		   "options passed to clang when compiling BPF scriptlets"),
 		   "options passed to clang when compiling BPF scriptlets"),
 	OPT_STRING(0, "vmlinux", &symbol_conf.vmlinux_name,
 	OPT_STRING(0, "vmlinux", &symbol_conf.vmlinux_name,
 		   "file", "vmlinux pathname"),
 		   "file", "vmlinux pathname"),
+	OPT_BOOLEAN(0, "buildid-all", &record.buildid_all,
+		    "Record build-id of all DSOs regardless of hits"),
 	OPT_END()
 	OPT_END()
 };
 };
 
 
@@ -1255,6 +1261,14 @@ int cmd_record(int argc, const char **argv, const char *prefix __maybe_unused)
 	if (err)
 	if (err)
 		goto out_symbol_exit;
 		goto out_symbol_exit;
 
 
+	/*
+	 * We take all buildids when the file contains
+	 * AUX area tracing data because we do not decode the
+	 * trace because it would take too long.
+	 */
+	if (rec->opts.full_auxtrace)
+		rec->buildid_all = true;
+
 	if (record_opts__config(&rec->opts)) {
 	if (record_opts__config(&rec->opts)) {
 		err = -EINVAL;
 		err = -EINVAL;
 		goto out_symbol_exit;
 		goto out_symbol_exit;