Re: [PATCH v8 2/4] perf inject: add jitdump mmap injection support

From: Arnaldo Carvalho de Melo
Date: Fri Jan 22 2016 - 17:13:53 EST


Em Fri, Jan 22, 2016 at 01:22:51PM -0800, Stephane Eranian escreveu:
> On Fri, Jan 22, 2016 at 12:44 PM, Arnaldo Carvalho de Melo
> <acme@xxxxxxxxxx> wrote:
> > Em Mon, Nov 30, 2015 at 10:02:21AM +0100, Stephane Eranian escreveu:
> >> 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
> >
> > 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


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


diff --git a/tools/perf/builtin-inject.c b/tools/perf/builtin-inject.c
index 606653f30759..b38445f08c2f 100644
--- a/tools/perf/builtin-inject.c
+++ b/tools/perf/builtin-inject.c
@@ -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;
diff --git a/tools/perf/util/Build b/tools/perf/util/Build
index 9ef707198941..52a4a806ee2f 100644
--- a/tools/perf/util/Build
+++ b/tools/perf/util/Build
@@ -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 -----