Add new command-line option to perf data convert for generating trace.dat output files.
The --to-trace-dat option: - Accepts output filename for trace.dat format - Mutually exclusive with --to-ctf and --to-json - Calls trace_convert__perf2dat() to perform conversion Usage: $ perf record -e sched:* -a sleep 1 $ perf data convert --to-trace-dat=trace.dat $ trace-cmd report trace.dat Document the new option in Documentation/perf-data.txt alongside the existing --to-ctf and --to-json entries. Signed-off-by: Tanushree Shah <[email protected]> --- tools/perf/Documentation/perf-data.txt | 7 +++++ tools/perf/builtin-data.c | 40 ++++++++++++++++++++++++-- tools/perf/util/trace-dat.c | 3 ++ 3 files changed, 48 insertions(+), 2 deletions(-) diff --git a/tools/perf/Documentation/perf-data.txt b/tools/perf/Documentation/perf-data.txt index 20f178d61ed7..578ba6357183 100644 --- a/tools/perf/Documentation/perf-data.txt +++ b/tools/perf/Documentation/perf-data.txt @@ -30,6 +30,13 @@ OPTIONS for 'convert' --to-json:: Triggers JSON conversion. Specify the JSON filename to output. +--to-trace-dat:: + Triggers trace.dat conversion. Converts perf.data tracepoint events + to trace.dat format v7, compatible with trace-cmd and KernelShark. + Only PERF_TYPE_TRACEPOINT events are converted. Specify the + trace.dat filename to output. Requires libtraceevent support. + Mutually exclusive with --to-ctf and --to-json. + --tod:: Convert time to wall clock time. diff --git a/tools/perf/builtin-data.c b/tools/perf/builtin-data.c index 4c08ccb8c06b..194537503ba9 100644 --- a/tools/perf/builtin-data.c +++ b/tools/perf/builtin-data.c @@ -30,6 +30,11 @@ static const char *data_usage[] = { static const char *to_json; static const char *to_ctf; + +#ifdef HAVE_LIBTRACEEVENT +static const char *trace_dat_output; +#endif + static struct perf_data_convert_opts opts = { .force = false, .all = false, @@ -48,6 +53,10 @@ static const struct option data_options[] = { OPT_BOOLEAN(0, "all", &opts.all, "Convert all events"), OPT_STRING(0, "time", &opts.time_str, "str", "Time span of interest (start,stop)"), +#ifdef HAVE_LIBTRACEEVENT + OPT_STRING(0, "to-trace-dat", &trace_dat_output, + "file", "Convert to trace.dat format using perf.data tracepoints"), +#endif OPT_END() }; @@ -65,16 +74,43 @@ static int cmd_data_convert(int argc, const char **argv) pr_err("You cannot specify both --to-ctf and --to-json.\n"); return -1; } +#ifdef HAVE_LIBTRACEEVENT + if (trace_dat_output && (to_json || to_ctf)) { + pr_err("You cannot specify --to-trace-dat with --to-ctf or --to-json.\n"); + return -1; + } +#endif + #ifdef HAVE_LIBBABELTRACE_SUPPORT + #ifdef HAVE_LIBTRACEEVENT + if (!to_json && !to_ctf && !trace_dat_output) { + pr_err("You must specify one of --to-ctf, --to-json, or --to-trace-dat.\n"); + return -1; + } + #else if (!to_json && !to_ctf) { pr_err("You must specify one of --to-ctf or --to-json.\n"); return -1; } + #endif #else + #ifdef HAVE_LIBTRACEEVENT + if (!to_json && !trace_dat_output) { + pr_err("You must specify --to-json or --to-trace-dat.\n"); + return -1; + } + #else if (!to_json) { pr_err("You must specify --to-json.\n"); - return -1; -} + return -1; + } + #endif +#endif + +#ifdef HAVE_LIBTRACEEVENT + if (trace_dat_output) + return trace_convert__perf2dat(input_name ? input_name : "perf.data", + trace_dat_output, &opts); #endif if (to_json) diff --git a/tools/perf/util/trace-dat.c b/tools/perf/util/trace-dat.c index f71e03716e27..5598496c9a61 100644 --- a/tools/perf/util/trace-dat.c +++ b/tools/perf/util/trace-dat.c @@ -861,6 +861,9 @@ void trace_dat__free_cpu_buffers(void) for (cpu = 0; cpu < trace_dat_nr_cpus; cpu++) { int i; + if (!trace_cpu_data[cpu].events) + continue; + for (i = 0; i < trace_cpu_data[cpu].count; i++) free(trace_cpu_data[cpu].events[i].raw); free(trace_cpu_data[cpu].events); -- 2.47.3
