On Tue, May 23, 2017 at 12:48:53AM -0700, David Carrillo-Cisneros wrote: > Add header record types to pipe-mode, reusing the functions > used in file-mode and leveraging the new struct feat_fd. > > Add the perf_event__synthesize_feature event call back to > process the new header records. > > Before this patch: > > $ perf record -o - -e cycles sleep 1 | perf report --stdio --header > [ perf record: Woken up 1 times to write data ] > [ perf record: Captured and wrote 0.000 MB - ] > ... > > After this patch: > $ 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 -o - -e cycles -c 100000 sleep 1 > # HEADER_CPU_TOPOLOGY info available, use -I to display > # HEADER_NUMA_TOPOLOGY info available, use -I to display > # pmu mappings: intel_bts = 6, uncore_imc_4 = 22, uncore_sbox_1 = 47, > uncore_cbox_5 = 33, uncore_ha_0 = 16, uncore_cbox > [ perf record: Woken up 1 times to write data ] > [ perf record: Captured and wrote 0.000 MB - ] > ... > > Support added for the subcommands: report, inject, annotate and script. > > Signed-off-by: David Carrillo-Cisneros <davi...@google.com> > ---
[SNIP] > +struct feature_event { > + struct perf_event_header header; > + u64 header_id; s/header_id/feat_id/ ? > + char data[]; /* size bytes of raw data specific to the feature */ > +}; > + > union perf_event { > struct perf_event_header header; > struct mmap_event mmap; [SNIP] > +int perf_event__process_feature(struct perf_tool *tool, > + union perf_event *event, > + struct perf_session *session __maybe_unused) > +{ > + struct feat_fd fd = { .fd = 0 }; > + struct feature_event *fe = (struct feature_event *)event; > + int type = fe->header.type; > + u64 feat = fe->header_id; > + > + if (type < 0 || type >= PERF_RECORD_HEADER_MAX) { > + pr_warning("invalid record type %d\n", type); > + return 0; > + } > + if (feat == HEADER_RESERVED) > + return -1; > + > + if (feat > HEADER_LAST_FEATURE) > + return 0; > + > + if (!feat_ops[feat].process) > + return 0; Checking here.. > + > + /* > + * no print routine > + */ > + if (!feat_ops[feat].print) > + return 0; > + > + fd.buf = (void *)fe->data; > + fd.size = event->header.size - sizeof(event->header); > + fd.ph = &session->header; > + > + if (!tool->show_feat_hdr) > + return 0; > + > + if (!feat_ops[feat].full_only || > + tool->show_feat_hdr >= SHOW_FEAT_HEADER_FULL_INFO) { > + if (feat_ops[feat].process) { .. and here again. Thanks, Namhyung > + if (feat_ops[feat].process(&fd, NULL)) > + return -1; > + } > + feat_ops[feat].print(&fd, stdout); > + } else { > + fprintf(stdout, "# %s info available, use -I to display\n", > + feat_ops[feat].name); > + } > + > + return 0; > +}