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>
This commit is contained in:
Родитель
03de8656c7
Коммит
96aea4daa6
|
@ -17,6 +17,14 @@
|
|||
#include "util/data.h"
|
||||
#include "util/debug.h"
|
||||
#include <linux/err.h>
|
||||
#include "util/tool.h"
|
||||
|
||||
static int process_header_feature(struct perf_session *session __maybe_unused,
|
||||
union perf_event *event __maybe_unused)
|
||||
{
|
||||
session_done = 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int __cmd_evlist(const char *file_name, struct perf_attr_details *details)
|
||||
{
|
||||
|
@ -27,12 +35,20 @@ static int __cmd_evlist(const char *file_name, struct perf_attr_details *details
|
|||
.mode = PERF_DATA_MODE_READ,
|
||||
.force = details->force,
|
||||
};
|
||||
struct perf_tool tool = {
|
||||
/* only needed for pipe mode */
|
||||
.attr = perf_event__process_attr,
|
||||
.feature = process_header_feature,
|
||||
};
|
||||
bool has_tracepoint = false;
|
||||
|
||||
session = perf_session__new(&data, 0, NULL);
|
||||
session = perf_session__new(&data, 0, &tool);
|
||||
if (IS_ERR(session))
|
||||
return PTR_ERR(session);
|
||||
|
||||
if (data.is_pipe)
|
||||
perf_session__process_events(session);
|
||||
|
||||
evlist__for_each_entry(session->evlist, pos) {
|
||||
evsel__fprintf(pos, details, stdout);
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче