lkml.org 
[lkml]   [2023]   [May]   [27]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    Subject[PATCH v5 02/34] perf cpumap: Add equal function
    From
    Equality is a useful property to compare after merging and
    intersecting maps.

    Signed-off-by: Ian Rogers <irogers@google.com>
    Reviewed-by: Kan Liang <kan.liang@linux.intel.com>
    ---
    tools/lib/perf/cpumap.c | 21 ++++++++++++++++
    tools/lib/perf/include/perf/cpumap.h | 2 ++
    tools/perf/tests/cpumap.c | 37 ++++++++++++++++++++++++++++
    3 files changed, 60 insertions(+)

    diff --git a/tools/lib/perf/cpumap.c b/tools/lib/perf/cpumap.c
    index ec3f4ac8b1e2..98d7cb24a158 100644
    --- a/tools/lib/perf/cpumap.c
    +++ b/tools/lib/perf/cpumap.c
    @@ -335,6 +335,27 @@ bool perf_cpu_map__has(const struct perf_cpu_map *cpus, struct perf_cpu cpu)
    return perf_cpu_map__idx(cpus, cpu) != -1;
    }

    +bool perf_cpu_map__equal(const struct perf_cpu_map *lhs, const struct perf_cpu_map *rhs)
    +{
    + int nr;
    +
    + if (lhs == rhs)
    + return true;
    +
    + if (!lhs || !rhs)
    + return false;
    +
    + nr = __perf_cpu_map__nr(lhs);
    + if (nr != __perf_cpu_map__nr(rhs))
    + return false;
    +
    + for (int idx = 0; idx < nr; idx++) {
    + if (__perf_cpu_map__cpu(lhs, idx).cpu != __perf_cpu_map__cpu(rhs, idx).cpu)
    + return false;
    + }
    + return true;
    +}
    +
    struct perf_cpu perf_cpu_map__max(const struct perf_cpu_map *map)
    {
    struct perf_cpu result = {
    diff --git a/tools/lib/perf/include/perf/cpumap.h b/tools/lib/perf/include/perf/cpumap.h
    index b4c9a827a88a..cedfc26d944e 100644
    --- a/tools/lib/perf/include/perf/cpumap.h
    +++ b/tools/lib/perf/include/perf/cpumap.h
    @@ -33,6 +33,8 @@ LIBPERF_API int perf_cpu_map__nr(const struct perf_cpu_map *cpus);
    LIBPERF_API bool perf_cpu_map__empty(const struct perf_cpu_map *map);
    LIBPERF_API struct perf_cpu perf_cpu_map__max(const struct perf_cpu_map *map);
    LIBPERF_API bool perf_cpu_map__has(const struct perf_cpu_map *map, struct perf_cpu cpu);
    +LIBPERF_API bool perf_cpu_map__equal(const struct perf_cpu_map *lhs,
    + const struct perf_cpu_map *rhs);

    #define perf_cpu_map__for_each_cpu(cpu, idx, cpus) \
    for ((idx) = 0, (cpu) = perf_cpu_map__cpu(cpus, idx); \
    diff --git a/tools/perf/tests/cpumap.c b/tools/perf/tests/cpumap.c
    index 83805690c209..7730fc2ab40b 100644
    --- a/tools/perf/tests/cpumap.c
    +++ b/tools/perf/tests/cpumap.c
    @@ -211,11 +211,48 @@ static int test__cpu_map_intersect(struct test_suite *test __maybe_unused,
    return ret;
    }

    +static int test__cpu_map_equal(struct test_suite *test __maybe_unused, int subtest __maybe_unused)
    +{
    + struct perf_cpu_map *any = perf_cpu_map__dummy_new();
    + struct perf_cpu_map *one = perf_cpu_map__new("1");
    + struct perf_cpu_map *two = perf_cpu_map__new("2");
    + struct perf_cpu_map *empty = perf_cpu_map__intersect(one, two);
    + struct perf_cpu_map *pair = perf_cpu_map__new("1-2");
    + struct perf_cpu_map *tmp;
    + struct perf_cpu_map *maps[] = {empty, any, one, two, pair};
    +
    + for (size_t i = 0; i < ARRAY_SIZE(maps); i++) {
    + /* Maps equal themself. */
    + TEST_ASSERT_VAL("equal", perf_cpu_map__equal(maps[i], maps[i]));
    + for (size_t j = 0; j < ARRAY_SIZE(maps); j++) {
    + /* Maps dont't equal each other. */
    + if (i == j)
    + continue;
    + TEST_ASSERT_VAL("not equal", !perf_cpu_map__equal(maps[i], maps[j]));
    + }
    + }
    +
    + /* Maps equal made maps. */
    + tmp = perf_cpu_map__merge(perf_cpu_map__get(one), two);
    + TEST_ASSERT_VAL("pair", perf_cpu_map__equal(pair, tmp));
    + perf_cpu_map__put(tmp);
    +
    + tmp = perf_cpu_map__intersect(pair, one);
    + TEST_ASSERT_VAL("one", perf_cpu_map__equal(one, tmp));
    + perf_cpu_map__put(tmp);
    +
    + for (size_t i = 0; i < ARRAY_SIZE(maps); i++)
    + perf_cpu_map__put(maps[i]);
    +
    + return TEST_OK;
    +}
    +
    static struct test_case tests__cpu_map[] = {
    TEST_CASE("Synthesize cpu map", cpu_map_synthesize),
    TEST_CASE("Print cpu map", cpu_map_print),
    TEST_CASE("Merge cpu map", cpu_map_merge),
    TEST_CASE("Intersect cpu map", cpu_map_intersect),
    + TEST_CASE("Equal cpu map", cpu_map_equal),
    { .name = NULL, }
    };

    --
    2.41.0.rc0.172.g3f132b7071-goog
    \
     
     \ /
      Last update: 2023-05-27 09:23    [W:5.934 / U:0.024 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site