diff options
author | Jiri Olsa <jolsa@redhat.com> | 2013-10-29 14:04:57 -0400 |
---|---|---|
committer | Arnaldo Carvalho de Melo <acme@redhat.com> | 2013-12-19 09:38:49 -0500 |
commit | 3406912cc1c631dea7ff050a9df92216e5a70e98 (patch) | |
tree | b2f9635ce0b573765b3060ce3316cdf37d77f7fa /tools/perf/builtin-inject.c | |
parent | 73db8f82619b7538d9b4badfe13f3ab2fef7d9b3 (diff) |
perf inject: Handle output file via perf_data_file object
Using the perf_data_file object to handle output file processing.
No functional change intended.
Signed-off-by: Jiri Olsa <jolsa@redhat.com>
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: David Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Ingo Molnar <mingo@kernel.org>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Link: http://lkml.kernel.org/n/tip-01j9ophd7tntmgrxa40uqjjm@git.kernel.org
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 | 65 |
1 files changed, 27 insertions, 38 deletions
diff --git a/tools/perf/builtin-inject.c b/tools/perf/builtin-inject.c index 6a2508589460..c9f6d74e1fd7 100644 --- a/tools/perf/builtin-inject.c +++ b/tools/perf/builtin-inject.c | |||
@@ -22,14 +22,13 @@ | |||
22 | #include <linux/list.h> | 22 | #include <linux/list.h> |
23 | 23 | ||
24 | struct perf_inject { | 24 | struct perf_inject { |
25 | struct perf_tool tool; | 25 | struct perf_tool tool; |
26 | bool build_ids; | 26 | bool build_ids; |
27 | bool sched_stat; | 27 | bool sched_stat; |
28 | const char *input_name; | 28 | const char *input_name; |
29 | int pipe_output, | 29 | struct perf_data_file output; |
30 | output; | 30 | u64 bytes_written; |
31 | u64 bytes_written; | 31 | struct list_head samples; |
32 | struct list_head samples; | ||
33 | }; | 32 | }; |
34 | 33 | ||
35 | struct event_entry { | 34 | struct event_entry { |
@@ -42,21 +41,14 @@ static int perf_event__repipe_synth(struct perf_tool *tool, | |||
42 | union perf_event *event) | 41 | union perf_event *event) |
43 | { | 42 | { |
44 | struct perf_inject *inject = container_of(tool, struct perf_inject, tool); | 43 | struct perf_inject *inject = container_of(tool, struct perf_inject, tool); |
45 | uint32_t size; | 44 | ssize_t size; |
46 | void *buf = event; | ||
47 | 45 | ||
48 | size = event->header.size; | 46 | size = perf_data_file__write(&inject->output, event, |
49 | 47 | event->header.size); | |
50 | while (size) { | 48 | if (size < 0) |
51 | int ret = write(inject->output, buf, size); | 49 | return -errno; |
52 | if (ret < 0) | ||
53 | return -errno; | ||
54 | |||
55 | size -= ret; | ||
56 | buf += ret; | ||
57 | inject->bytes_written += ret; | ||
58 | } | ||
59 | 50 | ||
51 | inject->bytes_written += size; | ||
60 | return 0; | 52 | return 0; |
61 | } | 53 | } |
62 | 54 | ||
@@ -80,7 +72,7 @@ static int perf_event__repipe_attr(struct perf_tool *tool, | |||
80 | if (ret) | 72 | if (ret) |
81 | return ret; | 73 | return ret; |
82 | 74 | ||
83 | if (!inject->pipe_output) | 75 | if (&inject->output.is_pipe) |
84 | return 0; | 76 | return 0; |
85 | 77 | ||
86 | return perf_event__repipe_synth(tool, event); | 78 | return perf_event__repipe_synth(tool, event); |
@@ -355,6 +347,7 @@ static int __cmd_inject(struct perf_inject *inject) | |||
355 | .path = inject->input_name, | 347 | .path = inject->input_name, |
356 | .mode = PERF_DATA_MODE_READ, | 348 | .mode = PERF_DATA_MODE_READ, |
357 | }; | 349 | }; |
350 | struct perf_data_file *file_out = &inject->output; | ||
358 | 351 | ||
359 | signal(SIGINT, sig_handler); | 352 | signal(SIGINT, sig_handler); |
360 | 353 | ||
@@ -391,14 +384,14 @@ static int __cmd_inject(struct perf_inject *inject) | |||
391 | } | 384 | } |
392 | } | 385 | } |
393 | 386 | ||
394 | if (!inject->pipe_output) | 387 | if (!file_out->is_pipe) |
395 | lseek(inject->output, session->header.data_offset, SEEK_SET); | 388 | lseek(file_out->fd, session->header.data_offset, SEEK_SET); |
396 | 389 | ||
397 | ret = perf_session__process_events(session, &inject->tool); | 390 | ret = perf_session__process_events(session, &inject->tool); |
398 | 391 | ||
399 | if (!inject->pipe_output) { | 392 | if (!file_out->is_pipe) { |
400 | session->header.data_size = inject->bytes_written; | 393 | session->header.data_size = inject->bytes_written; |
401 | perf_session__write_header(session, session->evlist, inject->output, true); | 394 | perf_session__write_header(session, session->evlist, file_out->fd, true); |
402 | } | 395 | } |
403 | 396 | ||
404 | perf_session__delete(session); | 397 | perf_session__delete(session); |
@@ -427,14 +420,17 @@ int cmd_inject(int argc, const char **argv, const char *prefix __maybe_unused) | |||
427 | }, | 420 | }, |
428 | .input_name = "-", | 421 | .input_name = "-", |
429 | .samples = LIST_HEAD_INIT(inject.samples), | 422 | .samples = LIST_HEAD_INIT(inject.samples), |
423 | .output = { | ||
424 | .path = "-", | ||
425 | .mode = PERF_DATA_MODE_WRITE, | ||
426 | }, | ||
430 | }; | 427 | }; |
431 | const char *output_name = "-"; | ||
432 | const struct option options[] = { | 428 | const struct option options[] = { |
433 | OPT_BOOLEAN('b', "build-ids", &inject.build_ids, | 429 | OPT_BOOLEAN('b', "build-ids", &inject.build_ids, |
434 | "Inject build-ids into the output stream"), | 430 | "Inject build-ids into the output stream"), |
435 | OPT_STRING('i', "input", &inject.input_name, "file", | 431 | OPT_STRING('i', "input", &inject.input_name, "file", |
436 | "input file name"), | 432 | "input file name"), |
437 | OPT_STRING('o', "output", &output_name, "file", | 433 | OPT_STRING('o', "output", &inject.output.path, "file", |
438 | "output file name"), | 434 | "output file name"), |
439 | OPT_BOOLEAN('s', "sched-stat", &inject.sched_stat, | 435 | OPT_BOOLEAN('s', "sched-stat", &inject.sched_stat, |
440 | "Merge sched-stat and sched-switch for getting events " | 436 | "Merge sched-stat and sched-switch for getting events " |
@@ -456,16 +452,9 @@ int cmd_inject(int argc, const char **argv, const char *prefix __maybe_unused) | |||
456 | if (argc) | 452 | if (argc) |
457 | usage_with_options(inject_usage, options); | 453 | usage_with_options(inject_usage, options); |
458 | 454 | ||
459 | if (!strcmp(output_name, "-")) { | 455 | if (perf_data_file__open(&inject.output)) { |
460 | inject.pipe_output = 1; | 456 | perror("failed to create output file"); |
461 | inject.output = STDOUT_FILENO; | 457 | return -1; |
462 | } else { | ||
463 | inject.output = open(output_name, O_CREAT | O_WRONLY | O_TRUNC, | ||
464 | S_IRUSR | S_IWUSR); | ||
465 | if (inject.output < 0) { | ||
466 | perror("failed to create output file"); | ||
467 | return -1; | ||
468 | } | ||
469 | } | 458 | } |
470 | 459 | ||
471 | if (symbol__init() < 0) | 460 | if (symbol__init() < 0) |