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


Reply via email to