Re: [PATCH v6 08/10] perf metricgroup: Support printing metric groups for system PMUs

From: Arnaldo Carvalho de Melo
Date: Mon Dec 07 2020 - 12:24:14 EST


Em Fri, Dec 04, 2020 at 07:10:14PM +0800, John Garry escreveu:
> Currently printing metricgroups for core- or uncore-based events matched
> by CPUID is supported.
>
> Extend this for system events.
>
> Signed-off-by: John Garry <john.garry@xxxxxxxxxx>
> Acked-by: Kajol Jain <kjain@xxxxxxxxxxxxx>
> ---
> tools/perf/util/metricgroup.c | 64 ++++++++++++++++++++++++++++++++---
> 1 file changed, 60 insertions(+), 4 deletions(-)
>
> diff --git a/tools/perf/util/metricgroup.c b/tools/perf/util/metricgroup.c
> index 4c6a686b08eb..abc5d0e28d0f 100644
> --- a/tools/perf/util/metricgroup.c
> +++ b/tools/perf/util/metricgroup.c
> @@ -559,6 +559,49 @@ static int metricgroup__print_pmu_event(struct pmu_event *pe,
> return 0;
> }
>
> +struct metricgroup_print_sys_idata {
> + struct strlist *metriclist;
> + bool metricgroups;
> + char *filter;
> + bool raw;
> + bool details;
> + struct rblist *groups;
> +};

I'm doing some reorg to avoid these holes:

[acme@five perf]$ pahole -C metricgroup_print_sys_idata ~/bin/perf
struct metricgroup_print_sys_idata {
struct strlist * metriclist; /* 0 8 */
_Bool metricgroups; /* 8 1 */

/* XXX 7 bytes hole, try to pack */

char * filter; /* 16 8 */
_Bool raw; /* 24 1 */
_Bool details; /* 25 1 */

/* XXX 6 bytes hole, try to pack */

struct rblist * groups; /* 32 8 */

/* size: 40, cachelines: 1, members: 6 */
/* sum members: 27, holes: 2, sum holes: 13 */
/* last cacheline: 40 bytes */
};
[acme@five perf]$

It ended up as:

[acme@five perf]$ pahole -C metricgroup_print_sys_idata ~/bin/perf
struct metricgroup_print_sys_idata {
struct strlist * metriclist; /* 0 8 */
char * filter; /* 8 8 */
struct rblist * groups; /* 16 8 */
_Bool metricgroups; /* 24 1 */
_Bool raw; /* 25 1 */
_Bool details; /* 26 1 */

/* size: 32, cachelines: 1, members: 6 */
/* padding: 5 */
/* last cacheline: 32 bytes */
};
[acme@five perf]$o

- Arnaldo

> +typedef int (*metricgroup_sys_event_iter_fn)(struct pmu_event *pe, void *);
> +
> +struct metricgroup_iter_data {
> + metricgroup_sys_event_iter_fn fn;
> + void *data;
> +};
> +
> +static int metricgroup__sys_event_iter(struct pmu_event *pe, void *data)
> +{
> + struct metricgroup_iter_data *d = data;
> + struct perf_pmu *pmu = NULL;
> +
> + if (!pe->metric_expr || !pe->compat)
> + return 0;
> +
> + while ((pmu = perf_pmu__scan(pmu))) {
> +
> + if (!pmu->id || strcmp(pmu->id, pe->compat))
> + continue;
> +
> + return d->fn(pe, d->data);
> + }
> +
> + return 0;
> +}
> +
> +static int metricgroup__print_sys_event_iter(struct pmu_event *pe, void *data)
> +{
> + struct metricgroup_print_sys_idata *d = data;
> +
> + return metricgroup__print_pmu_event(pe, d->metricgroups, d->filter, d->raw,
> + d->details, d->groups, d->metriclist);
> +}
> +
> void metricgroup__print(bool metrics, bool metricgroups, char *filter,
> bool raw, bool details)
> {
> @@ -569,9 +612,6 @@ void metricgroup__print(bool metrics, bool metricgroups, char *filter,
> struct rb_node *node, *next;
> struct strlist *metriclist = NULL;
>
> - if (!map)
> - return;
> -
> if (!metricgroups) {
> metriclist = strlist__new(NULL, NULL);
> if (!metriclist)
> @@ -582,7 +622,7 @@ void metricgroup__print(bool metrics, bool metricgroups, char *filter,
> groups.node_new = mep_new;
> groups.node_cmp = mep_cmp;
> groups.node_delete = mep_delete;
> - for (i = 0; ; i++) {
> + for (i = 0; map; i++) {
> pe = &map->table[i];
>
> if (!pe->name && !pe->metric_group && !pe->metric_name)
> @@ -595,6 +635,22 @@ void metricgroup__print(bool metrics, bool metricgroups, char *filter,
> return;
> }
>
> + {
> + struct metricgroup_iter_data data = {
> + .fn = metricgroup__print_sys_event_iter,
> + .data = (void *) &(struct metricgroup_print_sys_idata){
> + .metriclist = metriclist,
> + .metricgroups = metricgroups,
> + .filter = filter,
> + .raw = raw,
> + .details = details,
> + .groups = &groups,
> + },
> + };
> +
> + pmu_for_each_sys_event(metricgroup__sys_event_iter, &data);
> + }
> +
> if (!filter || !rblist__empty(&groups)) {
> if (metricgroups && !raw)
> printf("\nMetric Groups:\n\n");
> --
> 2.26.2
>

--

- Arnaldo