Re: [PATCH v5 03/12] perf util: Extend rbtree to support shadow stats
On 12/1/2017 10:10 PM, Arnaldo Carvalho de Melo wrote: Em Fri, Dec 01, 2017 at 06:57:27PM +0800, Jin Yao escreveu: Previously the rbtree was used to link generic metrics. Try to make the one line subject more descriptive, I'm changing it to: perf stat: Extend rbtree to support per-thread shadow stats - Arnaldo Yes, this new subject is better. Thanks Jin Yao This patches adds new ctx/type/stat into rbtree keys because we will use this rbtree to maintain shadow metrics to replace original a couple of static arrays for supporting per-thread shadow stats. Signed-off-by: Jin Yao --- tools/perf/util/stat-shadow.c | 27 +++ 1 file changed, 27 insertions(+) diff --git a/tools/perf/util/stat-shadow.c b/tools/perf/util/stat-shadow.c index 5853901..c53b80d 100644 --- a/tools/perf/util/stat-shadow.c +++ b/tools/perf/util/stat-shadow.c @@ -45,7 +45,10 @@ struct stats walltime_nsecs_stats; struct saved_value { struct rb_node rb_node; struct perf_evsel *evsel; + enum stat_type type; + int ctx; int cpu; + struct runtime_stat *stat; struct stats stats; }; @@ -58,6 +61,30 @@ static int saved_value_cmp(struct rb_node *rb_node, const void *entry) if (a->cpu != b->cpu) return a->cpu - b->cpu; + + /* +* Previously the rbtree was used to link generic metrics. +* The keys were evsel/cpu. Now the rbtree is extended to support +* per-thread shadow stats. For shadow stats case, the keys +* are cpu/type/ctx/stat (evsel is NULL). For generic metrics +* case, the keys are still evsel/cpu (type/ctx/stat are 0 or NULL). +*/ + if (a->type != b->type) + return a->type - b->type; + + if (a->ctx != b->ctx) + return a->ctx - b->ctx; + + if (a->evsel == NULL && b->evsel == NULL) { + if (a->stat == b->stat) + return 0; + + if ((char *)a->stat < (char *)b->stat) + return -1; + + return 1; + } + if (a->evsel == b->evsel) return 0; if ((char *)a->evsel < (char *)b->evsel) -- 2.7.4
Re: [PATCH v5 03/12] perf util: Extend rbtree to support shadow stats
Em Fri, Dec 01, 2017 at 06:57:27PM +0800, Jin Yao escreveu: > Previously the rbtree was used to link generic metrics. Try to make the one line subject more descriptive, I'm changing it to: perf stat: Extend rbtree to support per-thread shadow stats - Arnaldo > This patches adds new ctx/type/stat into rbtree keys because we > will use this rbtree to maintain shadow metrics to replace original > a couple of static arrays for supporting per-thread shadow stats. > > Signed-off-by: Jin Yao > --- > tools/perf/util/stat-shadow.c | 27 +++ > 1 file changed, 27 insertions(+) > > diff --git a/tools/perf/util/stat-shadow.c b/tools/perf/util/stat-shadow.c > index 5853901..c53b80d 100644 > --- a/tools/perf/util/stat-shadow.c > +++ b/tools/perf/util/stat-shadow.c > @@ -45,7 +45,10 @@ struct stats walltime_nsecs_stats; > struct saved_value { > struct rb_node rb_node; > struct perf_evsel *evsel; > + enum stat_type type; > + int ctx; > int cpu; > + struct runtime_stat *stat; > struct stats stats; > }; > > @@ -58,6 +61,30 @@ static int saved_value_cmp(struct rb_node *rb_node, const > void *entry) > > if (a->cpu != b->cpu) > return a->cpu - b->cpu; > + > + /* > + * Previously the rbtree was used to link generic metrics. > + * The keys were evsel/cpu. Now the rbtree is extended to support > + * per-thread shadow stats. For shadow stats case, the keys > + * are cpu/type/ctx/stat (evsel is NULL). For generic metrics > + * case, the keys are still evsel/cpu (type/ctx/stat are 0 or NULL). > + */ > + if (a->type != b->type) > + return a->type - b->type; > + > + if (a->ctx != b->ctx) > + return a->ctx - b->ctx; > + > + if (a->evsel == NULL && b->evsel == NULL) { > + if (a->stat == b->stat) > + return 0; > + > + if ((char *)a->stat < (char *)b->stat) > + return -1; > + > + return 1; > + } > + > if (a->evsel == b->evsel) > return 0; > if ((char *)a->evsel < (char *)b->evsel) > -- > 2.7.4