mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/herbert/cryptodev-2.6.git
synced 2026-05-02 18:17:50 -04:00
libperf cpumap: Refactor perf_cpu_map__merge()
The perf_cpu_map__merge() function has two arguments, 'orig' and 'other'. The function definition might cause confusion as it could give the impression that the CPU maps in the two arguments are copied into a new allocated structure, which is then returned as the result. The purpose of the function is to merge the CPU map 'other' into the CPU map 'orig'. This commit changes the 'orig' argument to a pointer to pointer, so the new result will be updated into 'orig'. The return value is changed to an int type, as an error number or 0 for success. Update callers and tests for the new function definition. Reviewed-by: Adrian Hunter <adrian.hunter@intel.com> Signed-off-by: Leo Yan <leo.yan@arm.com> Tested-by: Arnaldo Carvalho de Melo <acme@redhat.com> Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com> Cc: Ian Rogers <irogers@google.com> Cc: James Clark <james.clark@linaro.org> Cc: Jiri Olsa <jolsa@kernel.org> Cc: Kan Liang <kan.liang@linux.intel.com> Cc: Mark Rutland <mark.rutland@arm.com> Cc: Namhyung Kim <namhyung@kernel.org> Link: https://lore.kernel.org/r/20241107125308.41226-2-leo.yan@arm.com Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
committed by
Arnaldo Carvalho de Melo
parent
161c3402fd
commit
a9d2217556
@@ -1,4 +1,5 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-only
|
||||
#include <errno.h>
|
||||
#include <perf/cpumap.h>
|
||||
#include <stdlib.h>
|
||||
#include <linux/refcount.h>
|
||||
@@ -436,46 +437,49 @@ bool perf_cpu_map__is_subset(const struct perf_cpu_map *a, const struct perf_cpu
|
||||
}
|
||||
|
||||
/*
|
||||
* Merge two cpumaps
|
||||
* Merge two cpumaps.
|
||||
*
|
||||
* orig either gets freed and replaced with a new map, or reused
|
||||
* with no reference count change (similar to "realloc")
|
||||
* other has its reference count increased.
|
||||
* If 'other' is subset of '*orig', '*orig' keeps itself with no reference count
|
||||
* change (similar to "realloc").
|
||||
*
|
||||
* If '*orig' is subset of 'other', '*orig' reuses 'other' with its reference
|
||||
* count increased.
|
||||
*
|
||||
* Otherwise, '*orig' gets freed and replaced with a new map.
|
||||
*/
|
||||
|
||||
struct perf_cpu_map *perf_cpu_map__merge(struct perf_cpu_map *orig,
|
||||
struct perf_cpu_map *other)
|
||||
int perf_cpu_map__merge(struct perf_cpu_map **orig, struct perf_cpu_map *other)
|
||||
{
|
||||
struct perf_cpu *tmp_cpus;
|
||||
int tmp_len;
|
||||
int i, j, k;
|
||||
struct perf_cpu_map *merged;
|
||||
|
||||
if (perf_cpu_map__is_subset(orig, other))
|
||||
return orig;
|
||||
if (perf_cpu_map__is_subset(other, orig)) {
|
||||
perf_cpu_map__put(orig);
|
||||
return perf_cpu_map__get(other);
|
||||
if (perf_cpu_map__is_subset(*orig, other))
|
||||
return 0;
|
||||
if (perf_cpu_map__is_subset(other, *orig)) {
|
||||
perf_cpu_map__put(*orig);
|
||||
*orig = perf_cpu_map__get(other);
|
||||
return 0;
|
||||
}
|
||||
|
||||
tmp_len = __perf_cpu_map__nr(orig) + __perf_cpu_map__nr(other);
|
||||
tmp_len = __perf_cpu_map__nr(*orig) + __perf_cpu_map__nr(other);
|
||||
tmp_cpus = malloc(tmp_len * sizeof(struct perf_cpu));
|
||||
if (!tmp_cpus)
|
||||
return NULL;
|
||||
return -ENOMEM;
|
||||
|
||||
/* Standard merge algorithm from wikipedia */
|
||||
i = j = k = 0;
|
||||
while (i < __perf_cpu_map__nr(orig) && j < __perf_cpu_map__nr(other)) {
|
||||
if (__perf_cpu_map__cpu(orig, i).cpu <= __perf_cpu_map__cpu(other, j).cpu) {
|
||||
if (__perf_cpu_map__cpu(orig, i).cpu == __perf_cpu_map__cpu(other, j).cpu)
|
||||
while (i < __perf_cpu_map__nr(*orig) && j < __perf_cpu_map__nr(other)) {
|
||||
if (__perf_cpu_map__cpu(*orig, i).cpu <= __perf_cpu_map__cpu(other, j).cpu) {
|
||||
if (__perf_cpu_map__cpu(*orig, i).cpu == __perf_cpu_map__cpu(other, j).cpu)
|
||||
j++;
|
||||
tmp_cpus[k++] = __perf_cpu_map__cpu(orig, i++);
|
||||
tmp_cpus[k++] = __perf_cpu_map__cpu(*orig, i++);
|
||||
} else
|
||||
tmp_cpus[k++] = __perf_cpu_map__cpu(other, j++);
|
||||
}
|
||||
|
||||
while (i < __perf_cpu_map__nr(orig))
|
||||
tmp_cpus[k++] = __perf_cpu_map__cpu(orig, i++);
|
||||
while (i < __perf_cpu_map__nr(*orig))
|
||||
tmp_cpus[k++] = __perf_cpu_map__cpu(*orig, i++);
|
||||
|
||||
while (j < __perf_cpu_map__nr(other))
|
||||
tmp_cpus[k++] = __perf_cpu_map__cpu(other, j++);
|
||||
@@ -483,8 +487,9 @@ struct perf_cpu_map *perf_cpu_map__merge(struct perf_cpu_map *orig,
|
||||
|
||||
merged = cpu_map__trim_new(k, tmp_cpus);
|
||||
free(tmp_cpus);
|
||||
perf_cpu_map__put(orig);
|
||||
return merged;
|
||||
perf_cpu_map__put(*orig);
|
||||
*orig = merged;
|
||||
return 0;
|
||||
}
|
||||
|
||||
struct perf_cpu_map *perf_cpu_map__intersect(struct perf_cpu_map *orig,
|
||||
|
||||
Reference in New Issue
Block a user