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;
> +}

Reply via email to