perf cpumap: Maintain cpumaps ordered and without dups
Enforce this in _trim() Needed for followon change. Signed-off-by: Andi Kleen <ak@linux.intel.com> Acked-by: Jiri Olsa <jolsa@kernel.org> Link: http://lore.kernel.org/lkml/20191121001522.180827-4-andi@firstfloor.org Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
parent
e680a41fca
commit
7074674e73
1 changed files with 15 additions and 1 deletions
|
@ -68,14 +68,28 @@ static struct perf_cpu_map *cpu_map__default_new(void)
|
||||||
return cpus;
|
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)
|
static struct perf_cpu_map *cpu_map__trim_new(int nr_cpus, int *tmp_cpus)
|
||||||
{
|
{
|
||||||
size_t payload_size = nr_cpus * sizeof(int);
|
size_t payload_size = nr_cpus * sizeof(int);
|
||||||
struct perf_cpu_map *cpus = malloc(sizeof(*cpus) + payload_size);
|
struct perf_cpu_map *cpus = malloc(sizeof(*cpus) + payload_size);
|
||||||
|
int i, j;
|
||||||
|
|
||||||
if (cpus != NULL) {
|
if (cpus != NULL) {
|
||||||
cpus->nr = nr_cpus;
|
|
||||||
memcpy(cpus->map, tmp_cpus, payload_size);
|
memcpy(cpus->map, tmp_cpus, payload_size);
|
||||||
|
qsort(cpus->map, nr_cpus, sizeof(int), cmp_int);
|
||||||
|
/* Remove dups */
|
||||||
|
j = 0;
|
||||||
|
for (i = 0; i < nr_cpus; i++) {
|
||||||
|
if (i == 0 || cpus->map[i] != cpus->map[i - 1])
|
||||||
|
cpus->map[j++] = cpus->map[i];
|
||||||
|
}
|
||||||
|
cpus->nr = j;
|
||||||
|
assert(j <= nr_cpus);
|
||||||
refcount_set(&cpus->refcnt, 1);
|
refcount_set(&cpus->refcnt, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue