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.ga...@huawei.com> > Acked-by: Kajol Jain <kj...@linux.ibm.com> > --- > 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