diff options
author | Andrew Vagin <avagin@openvz.org> | 2012-08-07 08:56:02 -0400 |
---|---|---|
committer | Arnaldo Carvalho de Melo <acme@redhat.com> | 2012-10-26 09:22:24 -0400 |
commit | e558a5bd8b74aff4690a8c55b08a1dc91ef50d7c (patch) | |
tree | 7e9f031be393facfd33937622c34ea1b1afa1c8b /tools/perf/builtin-inject.c | |
parent | fcc328032e7382bf413517ee4dddf1eca7970fe4 (diff) |
perf inject: Work with files
Before this patch "perf inject" can only handle data from pipe.
I want to use "perf inject" for reworking events. Look at my following patch.
v2: add information about new options in tools/perf/Documentation/
Signed-off-by: Andrew Vagin <avagin@openvz.org>
Acked-by: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Link: http://lkml.kernel.org/r/1344344165-369636-2-git-send-email-avagin@openvz.org
[ committer note: fixed it up to cope with 5852a44, 5ded57a, 002439e & f62d3f0 ]
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Diffstat (limited to 'tools/perf/builtin-inject.c')
-rw-r--r-- | tools/perf/builtin-inject.c | 38 |
1 files changed, 35 insertions, 3 deletions
diff --git a/tools/perf/builtin-inject.c b/tools/perf/builtin-inject.c index 386a5c0013ff..a706ed57f94e 100644 --- a/tools/perf/builtin-inject.c +++ b/tools/perf/builtin-inject.c | |||
@@ -17,24 +17,30 @@ | |||
17 | struct perf_inject { | 17 | struct perf_inject { |
18 | struct perf_tool tool; | 18 | struct perf_tool tool; |
19 | bool build_ids; | 19 | bool build_ids; |
20 | const char *input_name; | ||
21 | int pipe_output, | ||
22 | output; | ||
23 | u64 bytes_written; | ||
20 | }; | 24 | }; |
21 | 25 | ||
22 | static int perf_event__repipe_synth(struct perf_tool *tool __maybe_unused, | 26 | static int perf_event__repipe_synth(struct perf_tool *tool, |
23 | union perf_event *event, | 27 | union perf_event *event, |
24 | struct machine *machine __maybe_unused) | 28 | struct machine *machine __maybe_unused) |
25 | { | 29 | { |
30 | struct perf_inject *inject = container_of(tool, struct perf_inject, tool); | ||
26 | uint32_t size; | 31 | uint32_t size; |
27 | void *buf = event; | 32 | void *buf = event; |
28 | 33 | ||
29 | size = event->header.size; | 34 | size = event->header.size; |
30 | 35 | ||
31 | while (size) { | 36 | while (size) { |
32 | int ret = write(STDOUT_FILENO, buf, size); | 37 | int ret = write(inject->output, buf, size); |
33 | if (ret < 0) | 38 | if (ret < 0) |
34 | return -errno; | 39 | return -errno; |
35 | 40 | ||
36 | size -= ret; | 41 | size -= ret; |
37 | buf += ret; | 42 | buf += ret; |
43 | inject->bytes_written += ret; | ||
38 | } | 44 | } |
39 | 45 | ||
40 | return 0; | 46 | return 0; |
@@ -231,12 +237,20 @@ static int __cmd_inject(struct perf_inject *inject) | |||
231 | inject->tool.tracing_data = perf_event__repipe_tracing_data; | 237 | inject->tool.tracing_data = perf_event__repipe_tracing_data; |
232 | } | 238 | } |
233 | 239 | ||
234 | session = perf_session__new("-", O_RDONLY, false, true, &inject->tool); | 240 | session = perf_session__new(inject->input_name, O_RDONLY, false, true, &inject->tool); |
235 | if (session == NULL) | 241 | if (session == NULL) |
236 | return -ENOMEM; | 242 | return -ENOMEM; |
237 | 243 | ||
244 | if (!inject->pipe_output) | ||
245 | lseek(inject->output, session->header.data_offset, SEEK_SET); | ||
246 | |||
238 | ret = perf_session__process_events(session, &inject->tool); | 247 | ret = perf_session__process_events(session, &inject->tool); |
239 | 248 | ||
249 | if (!inject->pipe_output) { | ||
250 | session->header.data_size = inject->bytes_written; | ||
251 | perf_session__write_header(session, session->evlist, inject->output, true); | ||
252 | } | ||
253 | |||
240 | perf_session__delete(session); | 254 | perf_session__delete(session); |
241 | 255 | ||
242 | return ret; | 256 | return ret; |
@@ -260,10 +274,16 @@ int cmd_inject(int argc, const char **argv, const char *prefix __maybe_unused) | |||
260 | .tracing_data = perf_event__repipe_tracing_data_synth, | 274 | .tracing_data = perf_event__repipe_tracing_data_synth, |
261 | .build_id = perf_event__repipe_op2_synth, | 275 | .build_id = perf_event__repipe_op2_synth, |
262 | }, | 276 | }, |
277 | .input_name = "-", | ||
263 | }; | 278 | }; |
279 | const char *output_name = "-"; | ||
264 | const struct option options[] = { | 280 | const struct option options[] = { |
265 | OPT_BOOLEAN('b', "build-ids", &inject.build_ids, | 281 | OPT_BOOLEAN('b', "build-ids", &inject.build_ids, |
266 | "Inject build-ids into the output stream"), | 282 | "Inject build-ids into the output stream"), |
283 | OPT_STRING('i', "input", &inject.input_name, "file", | ||
284 | "input file name"), | ||
285 | OPT_STRING('o', "output", &output_name, "file", | ||
286 | "output file name"), | ||
267 | OPT_INCR('v', "verbose", &verbose, | 287 | OPT_INCR('v', "verbose", &verbose, |
268 | "be more verbose (show build ids, etc)"), | 288 | "be more verbose (show build ids, etc)"), |
269 | OPT_END() | 289 | OPT_END() |
@@ -281,6 +301,18 @@ int cmd_inject(int argc, const char **argv, const char *prefix __maybe_unused) | |||
281 | if (argc) | 301 | if (argc) |
282 | usage_with_options(inject_usage, options); | 302 | usage_with_options(inject_usage, options); |
283 | 303 | ||
304 | if (!strcmp(output_name, "-")) { | ||
305 | inject.pipe_output = 1; | ||
306 | inject.output = STDOUT_FILENO; | ||
307 | } else { | ||
308 | inject.output = open(output_name, O_CREAT | O_WRONLY | O_TRUNC, | ||
309 | S_IRUSR | S_IWUSR); | ||
310 | if (inject.output < 0) { | ||
311 | perror("failed to create output file"); | ||
312 | return -1; | ||
313 | } | ||
314 | } | ||
315 | |||
284 | if (symbol__init() < 0) | 316 | if (symbol__init() < 0) |
285 | return -1; | 317 | return -1; |
286 | 318 | ||