Skip to contentSkip to conversation

perf inject: add jitdump mmap injection support

PATCH Arnaldo Carvalho de Melo 1 participant 1 message Jan 22, 2016 perf events

lore
Share & tools
lore

Arnaldo Carvalho de Melo

author maintainer
#0 lore raw

Em Fri, Jan 22, 2016 at 01:22:51PM -0800, Stephane Eranian escreveu:

Quoted 16 lines
Quoted 14 lines · Arnaldo Carvalho de Melo

Em Mon, Nov 30, 2015 at 10:02:21AM +0100, Stephane Eranian escreveu:

Quoted 12 lines

This patch adds a --jit/-j option to perf inject.

This options injects MMAP records into the perf.data file to cover the jitted code mmaps. It also emits ELF images for each function in the jidump file. Those images are created where the jitdump file is. The MMAP records point to that location as well.

Typical flow:

$ perf record -k mono -- java -agentpath:libpjvmti.so java_class
$ perf inject --jit -i perf.data -o perf.data.jitted
$ perf report -i perf.data.jitted
Quoted 6 lines
Quoted 3 lines

So, it fails 'make -C tools/perf build-test', specifically the one where we ask for a NO_LIBELF build, trying to fix:

I have rebase to tip.git last night. Will try your branch today. Will add a couple of minor adjustments and also better documentation on how to use it.

Ok, but please work on top of my branch, that I'll push soon, for instance, I had to fold the patch below, to fix the NO_LIBELF=1 case, so, when one builds that way perf inject -h will say:

[acme@jouet linux]$ tools/perf/perf inject -h

Usage: perf inject [<options>]

    -b, --build-ids       Inject build-ids into the output stream
    -f, --force           don't complain, do it
    -i, --input <file>    input file name
    -j, --jit             merge jitdump files into perf.data file
                          (not built-in because NO_LIBELF=1)
    -o, --output <file>   output file name
    -s, --sched-stat      Merge sched-stat and sched-switch for getting

events where and how long tasks slept
-v, --verbose be more verbose (show build ids, etc)
--itrace[=<opts>]
Instruction Tracing options
--kallsyms <file>
kallsyms pathname
--strip strip non-synthesized events (use with
--itrace)

[acme@jouet linux]$

I did some other changes and carved out two bits into separate patches, will soon push what I have to a perf/jit branch in my tree so that you can take a look.

- Arnaldo

---------------------------------------------------------

tools/perf/builtin-inject.c +14 -4
index 606653f30759..b38445f08c2f 100644
@@ -73,12 +73,14 @@ static int perf_event__repipe_oe_synth(struct perf_tool *tool,
 	return perf_event__repipe_synth(tool, event);
 }
 
+#ifdef HAVE_LIBELF_SUPPORT
 static int perf_event__drop_oe(struct perf_tool *tool __maybe_unused,
 			       union perf_event *event __maybe_unused,
 			       struct ordered_events *oe __maybe_unused)
 {
 	return 0;
 }
+#endif
 
 static int perf_event__repipe_op2_synth(struct perf_tool *tool,
 					union perf_event *event,
@@ -243,6 +245,7 @@ static int perf_event__repipe_mmap(struct perf_tool *tool,
 	return err;
 }
 
+#ifdef HAVE_LIBELF_SUPPORT
 static int perf_event__jit_repipe_mmap(struct perf_tool *tool,
 				       union perf_event *event,
 				       struct perf_sample *sample,
@@ -261,6 +264,7 @@ static int perf_event__jit_repipe_mmap(struct perf_tool *tool,
 	}
 	return perf_event__repipe_mmap(tool, event, sample, machine);
 }
+#endif
 
 static int perf_event__repipe_mmap2(struct perf_tool *tool,
 				   union perf_event *event,
@@ -275,6 +279,7 @@ static int perf_event__repipe_mmap2(struct perf_tool *tool,
 	return err;
 }
 
+#ifdef HAVE_LIBELF_SUPPORT
 static int perf_event__jit_repipe_mmap2(struct perf_tool *tool,
 					union perf_event *event,
 					struct perf_sample *sample,
@@ -293,6 +298,7 @@ static int perf_event__jit_repipe_mmap2(struct perf_tool *tool,
 	}
 	return perf_event__repipe_mmap2(tool, event, sample, machine);
 }
+#endif
 
 static int perf_event__repipe_fork(struct perf_tool *tool,
 				   union perf_event *event,
@@ -711,6 +717,7 @@ static int __cmd_inject(struct perf_inject *inject)
 	return ret;
 }
 
+#ifdef HAVE_LIBELF_SUPPORT
 static int
 jit_validate_events(struct perf_session *session)
 {
@@ -725,6 +732,7 @@ jit_validate_events(struct perf_session *session)
 	}
 	return 0;
 }
+#endif
 
 int cmd_inject(int argc, const char **argv, const char *prefix __maybe_unused)
 {
@@ -765,7 +773,7 @@ int cmd_inject(int argc, const char **argv, const char *prefix __maybe_unused)
 	};
 	int ret;
 
-	const struct option options[] = {
+	struct option options[] = {
 		OPT_BOOLEAN('b', "build-ids", &inject.build_ids,
 			    "Inject build-ids into the output stream"),
 		OPT_STRING('i', "input", &inject.input_name, "file",
@@ -792,7 +800,9 @@ int cmd_inject(int argc, const char **argv, const char *prefix __maybe_unused)
 		"perf inject [<options>]",
 		NULL
 	};
-
+#ifndef HAVE_LIBELF_SUPPORT
+	set_option_nobuild(options, 'j', "jit", "NO_LIBELF=1", true);
+#endif
 	argc = parse_options(argc, argv, options, inject_usage, 0);
 
 	/*
@@ -828,7 +838,7 @@ int cmd_inject(int argc, const char **argv, const char *prefix __maybe_unused)
 		inject.tool.ordered_events = true;
 		inject.tool.ordering_requires_timestamps = true;
 	}
-
+#ifdef HAVE_LIBELF_SUPPORT
 	if (inject.jit_mode) {
 		/*
 		 * validate event is using the correct clockid
@@ -847,7 +857,7 @@ int cmd_inject(int argc, const char **argv, const char *prefix __maybe_unused)
 		 */
 		inject.tool.finished_round = perf_event__drop_oe;
 	}
-
+#endif
 	ret = symbol__init(&inject.session->header.env);
 	if (ret < 0)
 		goto out_delete;
tools/perf/util/Build +2 -2
index 9ef707198941..52a4a806ee2f 100644
@@ -106,8 +106,8 @@ libperf-y += scripting-engines/
 libperf-$(CONFIG_ZLIB) += zlib.o
 libperf-$(CONFIG_LZMA) += lzma.o
 libperf-y += demangle-java.o
-libperf-y += jitdump.o
-libperf-y += genelf.o
+libperf-$(CONFIG_LIBELF) += jitdump.o
+libperf-$(CONFIG_LIBELF) += genelf.o
 
 CFLAGS_config.o   += -DETC_PERFCONFIG="BUILD_STR($(ETC_PERFCONFIG_SQ))"
 

----- End forwarded message -----