Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

perf evlist: Support pipe mode display

Likewise, perf evlist command should print event attributes by reading
PERF_RECORD_HEADER_ATTR records.

Before:
$ perf record -o- true | ./perf evlist -i-
(prints nothing)

After:
$ perf record -o- true | ./perf evlist -i-
cycles:pppH

Committer testing:

Verbose mode also works as expected:

$ perf record -o- true | perf evlist -i-
cycles:uhH
$ perf record -o- true | perf evlist -vi-
cycles:uhH: size: 120, { sample_period, sample_freq }: 4000, sample_type: IP|TID|TIME|ID|PERIOD, read_format: ID, disabled: 1, inherit: 1, exclude_kernel: 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, ksymbol: 1, bpf_event: 1
$

Signed-off-by: Namhyung Kim <namhyung@kernel.org>
Acked-by: Jiri Olsa <jolsa@redhat.com>
Tested-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Ian Rogers <irogers@google.com>
Cc: Ingo Molnar <mingo@kernel.org>
Cc: Mark Rutland <mark.rutland@arm.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Link: https://lore.kernel.org/r/20201210061302.88213-2-namhyung@kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>

authored by

Namhyung Kim and committed by
Arnaldo Carvalho de Melo
96aea4da 03de8656

+17 -1
+17 -1
tools/perf/builtin-evlist.c
··· 17 17 #include "util/data.h" 18 18 #include "util/debug.h" 19 19 #include <linux/err.h> 20 + #include "util/tool.h" 21 + 22 + static int process_header_feature(struct perf_session *session __maybe_unused, 23 + union perf_event *event __maybe_unused) 24 + { 25 + session_done = 1; 26 + return 0; 27 + } 20 28 21 29 static int __cmd_evlist(const char *file_name, struct perf_attr_details *details) 22 30 { ··· 35 27 .mode = PERF_DATA_MODE_READ, 36 28 .force = details->force, 37 29 }; 30 + struct perf_tool tool = { 31 + /* only needed for pipe mode */ 32 + .attr = perf_event__process_attr, 33 + .feature = process_header_feature, 34 + }; 38 35 bool has_tracepoint = false; 39 36 40 - session = perf_session__new(&data, 0, NULL); 37 + session = perf_session__new(&data, 0, &tool); 41 38 if (IS_ERR(session)) 42 39 return PTR_ERR(session); 40 + 41 + if (data.is_pipe) 42 + perf_session__process_events(session); 43 43 44 44 evlist__for_each_entry(session->evlist, pos) { 45 45 evsel__fprintf(pos, details, stdout);