The new -M/--multi option enables multi file storage recording.  Now
sample data in separate mmap are saved in different files and other
events will be recorded in the perf.header file.

Signed-off-by: Namhyung Kim <namhy...@kernel.org>
---
 tools/perf/Documentation/perf-record.txt |  5 +++++
 tools/perf/builtin-record.c              | 27 ++++++++++++++++++++++++---
 2 files changed, 29 insertions(+), 3 deletions(-)

diff --git a/tools/perf/Documentation/perf-record.txt 
b/tools/perf/Documentation/perf-record.txt
index af9a54ece024..14247ccd7965 100644
--- a/tools/perf/Documentation/perf-record.txt
+++ b/tools/perf/Documentation/perf-record.txt
@@ -220,6 +220,11 @@ Capture machine state (registers) at interrupt, i.e., on 
counter overflows for
 each sample. List of captured registers depends on the architecture. This 
option
 is off by default.
 
+-M::
+--multi::
+Record data in multi-file storage instead of a single data file (perf.data).
+This will speed up perf report by parallel processing.
+
 SEE ALSO
 --------
 linkperf:perf-stat[1], linkperf:perf-list[1]
diff --git a/tools/perf/builtin-record.c b/tools/perf/builtin-record.c
index 4f97657f14e7..7f7a4725d080 100644
--- a/tools/perf/builtin-record.c
+++ b/tools/perf/builtin-record.c
@@ -58,6 +58,19 @@ static int record__write(struct record *rec, void *bf, 
size_t size)
        return 0;
 }
 
+static int record__write_multi(struct record *rec, void *bf, size_t size, int 
idx)
+{
+       if (rec->file.is_multi && idx >= 0) {
+               int ret = perf_data_file__write_multi(rec->session->file,
+                                                     bf, size, idx);
+               if (ret < 0)
+                       pr_err("failed to write perf data, error: %m\n");
+
+               return ret;
+       }
+       return record__write(rec, bf, size);
+}
+
 static int process_synthesized_event(struct perf_tool *tool,
                                     union perf_event *event,
                                     struct perf_sample *sample __maybe_unused,
@@ -89,7 +102,7 @@ static int record__mmap_read(struct record *rec, int idx)
                size = md->mask + 1 - (old & md->mask);
                old += size;
 
-               if (record__write(rec, buf, size) < 0) {
+               if (record__write_multi(rec, buf, size, idx) < 0) {
                        rc = -1;
                        goto out;
                }
@@ -99,7 +112,7 @@ static int record__mmap_read(struct record *rec, int idx)
        size = head - old;
        old += size;
 
-       if (record__write(rec, buf, size) < 0) {
+       if (record__write_multi(rec, buf, size, idx) < 0) {
                rc = -1;
                goto out;
        }
@@ -186,6 +199,10 @@ static int record__open(struct record *rec)
                goto out;
        }
 
+       rc = perf_data_file__prepare_write(session->file, evlist->nr_mmaps);
+       if (rc < 0)
+               goto out;
+
        session->evlist = evlist;
        perf_session__set_id_hdr_size(session);
 out:
@@ -822,6 +839,8 @@ struct option __record_options[] = {
                    "use per-thread mmaps"),
        OPT_BOOLEAN('I', "intr-regs", &record.opts.sample_intr_regs,
                    "Sample machine registers on interrupt"),
+       OPT_BOOLEAN('M', "multi", &record.opts.multi_file,
+                   "use multi-file storage"),
        OPT_END()
 };
 
@@ -871,8 +890,10 @@ int cmd_record(int argc, const char **argv, const char 
*prefix __maybe_unused)
                goto out_symbol_exit;
        }
 
-       if (rec->opts.multi_file)
+       if (rec->opts.multi_file) {
+               rec->file.is_multi = true;
                perf_evlist__prepend_dummy(rec->evlist);
+       }
 
        if (rec->opts.target.tid && !rec->opts.no_inherit_set)
                rec->opts.no_inherit = true;
-- 
2.1.3

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to