linux/tools/perf/tests/maps.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0
   2#include <linux/compiler.h>
   3#include <linux/kernel.h>
   4#include "tests.h"
   5#include "map.h"
   6#include "maps.h"
   7#include "dso.h"
   8#include "debug.h"
   9
  10struct map_def {
  11        const char *name;
  12        u64 start;
  13        u64 end;
  14};
  15
  16static int check_maps(struct map_def *merged, unsigned int size, struct maps *maps)
  17{
  18        struct map *map;
  19        unsigned int i = 0;
  20
  21        maps__for_each_entry(maps, map) {
  22                if (i > 0)
  23                        TEST_ASSERT_VAL("less maps expected", (map && i < size) || (!map && i == size));
  24
  25                TEST_ASSERT_VAL("wrong map start",  map->start == merged[i].start);
  26                TEST_ASSERT_VAL("wrong map end",    map->end == merged[i].end);
  27                TEST_ASSERT_VAL("wrong map name",  !strcmp(map->dso->name, merged[i].name));
  28                TEST_ASSERT_VAL("wrong map refcnt", refcount_read(&map->refcnt) == 1);
  29
  30                i++;
  31        }
  32
  33        return TEST_OK;
  34}
  35
  36int test__maps__merge_in(struct test *t __maybe_unused, int subtest __maybe_unused)
  37{
  38        struct maps maps;
  39        unsigned int i;
  40        struct map_def bpf_progs[] = {
  41                { "bpf_prog_1", 200, 300 },
  42                { "bpf_prog_2", 500, 600 },
  43                { "bpf_prog_3", 800, 900 },
  44        };
  45        struct map_def merged12[] = {
  46                { "kcore1",     100,  200 },
  47                { "bpf_prog_1", 200,  300 },
  48                { "kcore1",     300,  500 },
  49                { "bpf_prog_2", 500,  600 },
  50                { "kcore1",     600,  800 },
  51                { "bpf_prog_3", 800,  900 },
  52                { "kcore1",     900, 1000 },
  53        };
  54        struct map_def merged3[] = {
  55                { "kcore1",      100,  200 },
  56                { "bpf_prog_1",  200,  300 },
  57                { "kcore1",      300,  500 },
  58                { "bpf_prog_2",  500,  600 },
  59                { "kcore1",      600,  800 },
  60                { "bpf_prog_3",  800,  900 },
  61                { "kcore1",      900, 1000 },
  62                { "kcore3",     1000, 1100 },
  63        };
  64        struct map *map_kcore1, *map_kcore2, *map_kcore3;
  65        int ret;
  66
  67        maps__init(&maps, NULL);
  68
  69        for (i = 0; i < ARRAY_SIZE(bpf_progs); i++) {
  70                struct map *map;
  71
  72                map = dso__new_map(bpf_progs[i].name);
  73                TEST_ASSERT_VAL("failed to create map", map);
  74
  75                map->start = bpf_progs[i].start;
  76                map->end   = bpf_progs[i].end;
  77                maps__insert(&maps, map);
  78                map__put(map);
  79        }
  80
  81        map_kcore1 = dso__new_map("kcore1");
  82        TEST_ASSERT_VAL("failed to create map", map_kcore1);
  83
  84        map_kcore2 = dso__new_map("kcore2");
  85        TEST_ASSERT_VAL("failed to create map", map_kcore2);
  86
  87        map_kcore3 = dso__new_map("kcore3");
  88        TEST_ASSERT_VAL("failed to create map", map_kcore3);
  89
  90        /* kcore1 map overlaps over all bpf maps */
  91        map_kcore1->start = 100;
  92        map_kcore1->end   = 1000;
  93
  94        /* kcore2 map hides behind bpf_prog_2 */
  95        map_kcore2->start = 550;
  96        map_kcore2->end   = 570;
  97
  98        /* kcore3 map hides behind bpf_prog_3, kcore1 and adds new map */
  99        map_kcore3->start = 880;
 100        map_kcore3->end   = 1100;
 101
 102        ret = maps__merge_in(&maps, map_kcore1);
 103        TEST_ASSERT_VAL("failed to merge map", !ret);
 104
 105        ret = check_maps(merged12, ARRAY_SIZE(merged12), &maps);
 106        TEST_ASSERT_VAL("merge check failed", !ret);
 107
 108        ret = maps__merge_in(&maps, map_kcore2);
 109        TEST_ASSERT_VAL("failed to merge map", !ret);
 110
 111        ret = check_maps(merged12, ARRAY_SIZE(merged12), &maps);
 112        TEST_ASSERT_VAL("merge check failed", !ret);
 113
 114        ret = maps__merge_in(&maps, map_kcore3);
 115        TEST_ASSERT_VAL("failed to merge map", !ret);
 116
 117        ret = check_maps(merged3, ARRAY_SIZE(merged3), &maps);
 118        TEST_ASSERT_VAL("merge check failed", !ret);
 119
 120        maps__exit(&maps);
 121        return TEST_OK;
 122}
 123