perf header: In pipe mode dump features without --header/-I
authorIan Rogers <irogers@google.com>
Sat, 7 Jun 2025 06:12:35 +0000 (23:12 -0700)
committerNamhyung Kim <namhyung@kernel.org>
Wed, 25 Jun 2025 19:37:23 +0000 (12:37 -0700)
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>
tools/perf/util/header.c

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