[PATCH v5 00/16] perf tool: add meta-data header support for pipe-mode

David Carrillo-Cisneros
2017-07-11T23:54:21Z

v5: - Fix buffer leaking and size changes in
perf_event__synthesize_features.
- Remove unnecessary renaming.
- Remove extra tabs in do_write_string.
v4: - Limit write_* functions to page_size.
- Fixed bugs spotted by Jiri.
- Add information about pipe-mode to some error messages.
v3: - Fix header output for event aux record.
- Uniformize variable naming and other cleanup.
- Other fixes suggested by Jiri and Nahmyung.

v2: - Finer patch splitting.
- Add only one record type with a feature id instead of one
record per new feature (as suggested by Jiri).
- Add perf.data documentation.

(This is a rebased and updated version of Stephane Eranian's version
in https://patchwork.kernel.org/patch/1499081/)

Up until now, meta-data was only available when perf record
was used in "regular" mode, i.e., generating a perf.data file.
For users depending on pipe mode, neither host or event header
information were gathered. This patch addresses this limitation.

The difficulty in pipe mode is that information needs to be written
sequentially to the pipe. Meta data headers are usually generated
(and also expected) at the beginning of the file (or piped output).
To solve this problem, we introduce new synthetic record types,
one for each meta-data type. The approach is similar to what
is *ALREADY* used for BUILD_ID and TRACING_DATA.

We have modified util/header.c such that the same routines are used
to generate and read the meta-data information regardless of pipe-mode
vs. regular mode. To make this work, we added a new struct called
feat_fd which encapsulates all the information necessary to read or
write meta-data information to a file/pipe or from a file/pipe.

With this series, it is possible to get:
$ perf record -o - -e cycles sleep 1 | perf report --stdio --header
# ========
# captured on: Mon May 22 16:33:43 2017
# ========
#
# hostname : my_hostname
# os release : 4.11.0-dbx-up_perf
# perf version : 4.11.rc6.g6277c80
# arch : x86_64
# nrcpus online : 72
# nrcpus avail : 72
# cpudesc : Intel(R) Xeon(R) CPU E5-2696 v3 @ 2.30GHz
# cpuid : GenuineIntel,6,63,2
# total memory : 263457192 kB
# cmdline : /root/perf record -e cycles sleep 1
# event : name = cycles, , size = 112, { sample_period, sample_freq } = 4000, sample_type = IP|TID|TIME|PERIOD, disabled = 1, inherit = 1, mmap = 1, comm = 1, freq = 1, enable_on_exec = 1, task = 1, sample_id_all = 1, exclude_guest = 1, mmap2 = 1, comm_exec = 1
# CPU_TOPOLOGY info available, use -I to display
# NUMA_TOPOLOGY info available, use -I to display
# pmu mappings: intel_bts = 6, cpu = 4, msr = 49, uncore_cbox_10 = 36, [SNIP]
[ perf record: Woken up 1 times to write data ]
[ perf record: Captured and wrote 0.000 MB - ]
...

Only patches 14 to 16 have a significant effect in user observed behavior.
All other are transparent preparatory changes or bug fixes.

David Carrillo-Cisneros (16):
perf header: encapsulate read and swap
perf header: add PROCESS_STR_FUN macro
perf header: fail on write_padded error
perf util: add const modifier to buf in "writen" function
perf header: revamp do_write
perf header: add struct feat_fd for write
perf header: use struct feat_fd for print
perf header: use struct feat_fd to process header records
perf header: don't pass struct perf_file_section to process_##_feat
perf header: use struct feat_fd in read header records
perf header: make write_pmu_mappings pipe-mode friendly
perf header: add a buffer to struct feat_fd
perf header: change FEAT_OP* macros
perf tool: add show_feature_header to perf_tool
perf tools: add feature header record to pipe-mode
perf header: add event desc to pipe-mode header

tools/perf/Documentation/perf.data-file-format.txt | 10 +-
tools/perf/builtin-annotate.c | 1 +
tools/perf/builtin-inject.c | 1 +
tools/perf/builtin-record.c | 7 +
tools/perf/builtin-report.c | 5 +
tools/perf/builtin-script.c | 4 +
tools/perf/util/build-id.c | 10 +-
tools/perf/util/build-id.h | 4 +-
tools/perf/util/event.c | 1 +
tools/perf/util/event.h | 8 +
tools/perf/util/header.c | 1012 +++++++++++---------
tools/perf/util/header.h | 16 +-
tools/perf/util/session.c | 4 +
tools/perf/util/tool.h | 10 +-
tools/perf/util/util.c | 6 +-
tools/perf/util/util.h | 2 +-
16 files changed, 633 insertions(+), 468 deletions(-)

--
2.13.2.725.g09c95d1e9-goog