From: Namhyung Kim <namhyung@kernel.org>
To: Arnaldo Carvalho de Melo <acme@kernel.org>, Jiri Olsa <jolsa@redhat.com>
Cc: Ingo Molnar <mingo@kernel.org>,
Peter Zijlstra <peterz@infradead.org>,
LKML <linux-kernel@vger.kernel.org>,
Andi Kleen <ak@linux.intel.com>, Ian Rogers <irogers@google.com>,
Adrian Hunter <adrian.hunter@intel.com>
Subject: [PATCH 4/4] perf inject: Fix output from a file to a pipe
Date: Wed, 7 Jul 2021 11:05:36 -0700 [thread overview]
Message-ID: <20210707180536.72175-5-namhyung@kernel.org> (raw)
In-Reply-To: <20210707180536.72175-1-namhyung@kernel.org>
When the input is a regular file but the output is a pipe, it should
write a pipe header. But just repiping would write a portion of the
existing header which is different in 'size' value. So we need to
prevent it and write a new pipe header along with other information
like event attributes and features.
This can handle something like this:
# perf record -a -B sleep 1
# perf inject -b -i perf.data | perf report -i -
Signed-off-by: Namhyung Kim <namhyung@kernel.org>
---
tools/perf/builtin-inject.c | 57 +++++++++++++++++++++++++++++++++++--
1 file changed, 55 insertions(+), 2 deletions(-)
diff --git a/tools/perf/builtin-inject.c b/tools/perf/builtin-inject.c
index 7c126597d3f5..50ed158c8076 100644
--- a/tools/perf/builtin-inject.c
+++ b/tools/perf/builtin-inject.c
@@ -918,6 +918,7 @@ int cmd_inject(int argc, const char **argv)
.use_stdio = true,
};
int ret;
+ bool repipe = true;
struct option options[] = {
OPT_BOOLEAN('b', "build-ids", &inject.build_ids,
@@ -992,10 +993,18 @@ int cmd_inject(int argc, const char **argv)
}
data.path = inject.input_name;
- if (!strcmp(inject.input_name, "-") || inject.output.is_pipe)
+ if (!strcmp(inject.input_name, "-") || inject.output.is_pipe) {
inject.is_pipe = true;
+ /*
+ * Do not repipe header when input is a regular file
+ * since either it can rewrite the header at the end
+ * or write a new pipe header.
+ */
+ if (strcmp(inject.input_name, "-"))
+ repipe = false;
+ }
- inject.session = __perf_session__new(&data, inject.is_pipe,
+ inject.session = __perf_session__new(&data, repipe,
perf_data__fd(&inject.output),
&inject.tool);
if (IS_ERR(inject.session))
@@ -1004,6 +1013,50 @@ int cmd_inject(int argc, const char **argv)
if (zstd_init(&(inject.session->zstd_data), 0) < 0)
pr_warning("Decompression initialization failed.\n");
+ if (!data.is_pipe && inject.output.is_pipe) {
+ ret = perf_header__write_pipe(perf_data__fd(&inject.output));
+ if (ret < 0) {
+ pr_err("Couldn't write a new pipe header.\n");
+ goto out_delete;
+ }
+
+ ret = perf_event__synthesize_attrs(&inject.tool,
+ inject.session->evlist,
+ perf_event__repipe);
+ if (ret < 0) {
+ pr_err("Couldn't inject synthesized attrs.\n");
+ goto out_delete;
+ }
+
+ ret = perf_event__synthesize_features(&inject.tool,
+ inject.session,
+ inject.session->evlist,
+ perf_event__repipe);
+ if (ret < 0) {
+ pr_err("Couldn't inject synthesized features.\n");
+ goto out_delete;
+ }
+
+ if (have_tracepoints(&inject.session->evlist->core.entries)) {
+ /*
+ * FIXME err <= 0 here actually means that
+ * there were no tracepoints so its not really
+ * an error, just that we don't need to
+ * synthesize anything. We really have to
+ * return this more properly and also
+ * propagate errors that now are calling die()
+ */
+ ret = perf_event__synthesize_tracing_data(&inject.tool,
+ perf_data__fd(&inject.output),
+ inject.session->evlist,
+ perf_event__repipe);
+ if (ret <= 0) {
+ pr_err("Couldn't inject tracing data.\n");
+ goto out_delete;
+ }
+ }
+ }
+
if (inject.build_ids && !inject.build_id_all) {
/*
* to make sure the mmap records are ordered correctly
--
2.32.0.93.g670b81a890-goog
next prev parent reply other threads:[~2021-07-07 18:05 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-07-07 18:05 [PATCHSET 0/4] perf inject: Fix broken data with mixed input/output Namhyung Kim
2021-07-07 18:05 ` [PATCH 1/4] perf tools: Remove repipe argument from perf_session__new() Namhyung Kim
2021-07-07 18:05 ` [PATCH 2/4] perf tools: Pass a fd to perf_file_header__read_pipe() Namhyung Kim
2021-07-07 18:05 ` [PATCH 3/4] perf inject: Fix output from a pipe to a file Namhyung Kim
2021-07-07 18:05 ` Namhyung Kim [this message]
2021-07-11 15:44 ` [PATCH 4/4] perf inject: Fix output from a file to a pipe Jiri Olsa
2021-07-13 7:35 ` Namhyung Kim
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20210707180536.72175-5-namhyung@kernel.org \
--to=namhyung@kernel.org \
--cc=acme@kernel.org \
--cc=adrian.hunter@intel.com \
--cc=ak@linux.intel.com \
--cc=irogers@google.com \
--cc=jolsa@redhat.com \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@kernel.org \
--cc=peterz@infradead.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®