perf header: In pipe mode dump features without --header/-I

In pipe mode the header features are contained within events. While
other events dump details the header features only dump if --header or
-I are passed, which doesn't make sense as in pipe mode there is no
perf file header. Make the printing of the information conditional on
dump_trace as with other events.

Before:
```
$ perf record -o - -a sleep 1 | perf script -D -i -
...
0x2c8@pipe [0x54]: event: 80
.
. ... raw event: size 84 bytes
.  0000:  50 00 00 00 00 00 54 00 05 00 00 00 00 00 00 00  P.....T.........
.  0010:  40 00 00 00 36 2e 31 35 2e 72 63 37 2e 67 61 64  @...6.15.rc7.gad
.  0020:  32 61 36 39 31 63 39 39 66 62 00 00 00 00 00 00  2a691c99fb......
.  0030:  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
.  0040:  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
.  0050:  00 00 00 00                                      ....

0 0 0x2c8 [0x54]: PERF_RECORD_FEATURE
```

After:
```
$ perf record -o - -a sleep 1 | perf script -D -i -
...
0x2c8@pipe [0x54]: event: 80
.
. ... raw event: size 84 bytes
.  0000:  50 00 00 00 00 00 54 00 05 00 00 00 00 00 00 00  P.....T.........
.  0010:  40 00 00 00 36 2e 31 35 2e 72 63 37 2e 67 61 64  @...6.15.rc7.gad
.  0020:  32 61 36 39 31 63 39 39 66 62 00 00 00 00 00 00  2a691c99fb......
.  0030:  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
.  0040:  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
.  0050:  00 00 00 00                                      ....

0 0 0x2c8 [0x54]: PERF_RECORD_FEATURE, # perf version : 6.15.rc7.gad2a691c99fb
```

Signed-off-by: Ian Rogers <irogers@google.com>
Link: https://lore.kernel.org/r/20250617223356.2752099-4-irogers@google.com
Signed-off-by: Namhyung Kim <namhyung@kernel.org>
This commit is contained in:
Ian Rogers 2025-06-06 23:12:35 -07:00 committed by Namhyung Kim
parent 45cd84bd7a
commit 61051f9a84

View file

@ -4326,7 +4326,6 @@ out_delete_evlist:
int perf_event__process_feature(struct perf_session *session, int perf_event__process_feature(struct perf_session *session,
union perf_event *event) union perf_event *event)
{ {
const struct perf_tool *tool = session->tool;
struct feat_fd ff = { .fd = 0 }; struct feat_fd ff = { .fd = 0 };
struct perf_record_header_feature *fe = (struct perf_record_header_feature *)event; struct perf_record_header_feature *fe = (struct perf_record_header_feature *)event;
int type = fe->header.type; int type = fe->header.type;
@ -4342,28 +4341,23 @@ int perf_event__process_feature(struct perf_session *session,
return -1; return -1;
} }
if (!feat_ops[feat].process)
return 0;
ff.buf = (void *)fe->data; ff.buf = (void *)fe->data;
ff.size = event->header.size - sizeof(*fe); ff.size = event->header.size - sizeof(*fe);
ff.ph = &session->header; ff.ph = &session->header;
if (feat_ops[feat].process(&ff, NULL)) { if (feat_ops[feat].process && feat_ops[feat].process(&ff, NULL)) {
ret = -1; ret = -1;
goto out; goto out;
} }
if (!feat_ops[feat].print || !tool->show_feat_hdr) if (dump_trace) {
goto out; printf(", ");
if (feat_ops[feat].print)
if (!feat_ops[feat].full_only || feat_ops[feat].print(&ff, stdout);
tool->show_feat_hdr >= SHOW_FEAT_HEADER_FULL_INFO) { else
feat_ops[feat].print(&ff, stdout); printf("# %s", feat_ops[feat].name);
} else {
fprintf(stdout, "# %s info available, use -I to display\n",
feat_ops[feat].name);
} }
out: out:
free_event_desc(ff.events); free_event_desc(ff.events);
return ret; return ret;