Messages in this thread | | | Date | Wed, 6 Nov 2019 17:34:07 +0100 | From | Jiri Olsa <> | Subject | Re: [PATCH v4 3/9] perf evlist: Maintain evlist->all_cpus |
| |
On Mon, Nov 04, 2019 at 04:25:16PM -0800, Andi Kleen wrote: > From: Andi Kleen <ak@linux.intel.com> > > Maintain a cpumap in the evlist that is the union of all the cpus > of the events. > > This needs a cpumap merge operation. To make the merge operation > work efficiently maintain the cpumap in a sorted state. > > The sorting is also needed for the affinity loop changes later. > > Signed-off-by: Andi Kleen <ak@linux.intel.com> > --- > tools/perf/lib/cpumap.c | 42 ++++++++++++++++++++++++ > tools/perf/lib/evlist.c | 1 + > tools/perf/lib/include/internal/evlist.h | 1 + > tools/perf/lib/include/perf/cpumap.h | 2 ++ > 4 files changed, 46 insertions(+) > > diff --git a/tools/perf/lib/cpumap.c b/tools/perf/lib/cpumap.c > index 2ca1fafa620d..5ca26a9d318f 100644 > --- a/tools/perf/lib/cpumap.c > +++ b/tools/perf/lib/cpumap.c > @@ -68,6 +68,11 @@ static struct perf_cpu_map *cpu_map__default_new(void) > return cpus; > } > > +static int cmp_int(const void *a, const void *b) > +{ > + return *(const int *)a - *(const int*)b; > +} > + > static struct perf_cpu_map *cpu_map__trim_new(int nr_cpus, int *tmp_cpus) > { > size_t payload_size = nr_cpus * sizeof(int); > @@ -76,6 +81,7 @@ static struct perf_cpu_map *cpu_map__trim_new(int nr_cpus, int *tmp_cpus) > if (cpus != NULL) { > cpus->nr = nr_cpus; > memcpy(cpus->map, tmp_cpus, payload_size); > + qsort(cpus->map, nr_cpus, sizeof(int), cmp_int); > refcount_set(&cpus->refcnt, 1); > }
please move the sort into separate change
> > @@ -272,3 +278,39 @@ int perf_cpu_map__max(struct perf_cpu_map *map) > > return max; > } > + > +struct perf_cpu_map *perf_cpu_map__update(struct perf_cpu_map *orig, > + struct perf_cpu_map *other) > +{
it's more like perf_cpu_map__merge, right?
> + int *tmp_cpus; > + int tmp_len; > + int i, j, k; > + struct perf_cpu_map *merged; > + > + if (!orig) { > + perf_cpu_map__get(other); > + return other; > + } > + if (orig->nr == other->nr && > + !memcmp(orig->map, other->map, orig->nr * sizeof(int))) > + return orig; > + tmp_len = orig->nr + other->nr; > + tmp_cpus = malloc(tmp_len * sizeof(int)); > + if (!tmp_cpus) > + return NULL; > + i = j = k = 0; > + while (i < orig->nr && j < other->nr) { > + if (orig->map[i] <= other->map[j]) > + tmp_cpus[k++] = orig->map[i++]; > + else > + tmp_cpus[k++] = other->map[j++]; > + } > + while (i < orig->nr) > + tmp_cpus[k++] = orig->map[i++]; > + while (j < other->nr) > + tmp_cpus[k++] = other->map[j++]; > + assert(k < tmp_len); > + merged = cpu_map__trim_new(k, tmp_cpus); > + free(tmp_cpus); > + return merged; > +}
this is great function for automated test, please add
thanks, jirka
| |