^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) // SPDX-License-Identifier: GPL-2.0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) #include "util/map_symbol.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) #include "util/mem-events.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) #include "util/symbol.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) #include "linux/perf_event.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) #include "util/debug.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) #include "tests.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) #include <string.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) static int check(union perf_mem_data_src data_src,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) const char *string)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) char out[100];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) char failure[100];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) struct mem_info mi = { .data_src = data_src };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) int n;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) n = perf_mem__snp_scnprintf(out, sizeof out, &mi);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) n += perf_mem__lvl_scnprintf(out + n, sizeof out - n, &mi);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) scnprintf(failure, sizeof failure, "unexpected %s", out);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) TEST_ASSERT_VAL(failure, !strcmp(string, out));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) int test__mem(struct test *text __maybe_unused, int subtest __maybe_unused)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) int ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) union perf_mem_data_src src;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) memset(&src, 0, sizeof(src));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) src.mem_lvl = PERF_MEM_LVL_HIT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) src.mem_lvl_num = 4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) ret |= check(src, "N/AL4 hit");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) src.mem_remote = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) ret |= check(src, "N/ARemote L4 hit");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) src.mem_lvl = PERF_MEM_LVL_MISS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) src.mem_lvl_num = PERF_MEM_LVLNUM_PMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) src.mem_remote = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) ret |= check(src, "N/APMEM miss");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) src.mem_remote = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) ret |= check(src, "N/ARemote PMEM miss");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) src.mem_snoopx = PERF_MEM_SNOOPX_FWD;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) src.mem_lvl_num = PERF_MEM_LVLNUM_RAM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) ret |= check(src , "FwdRemote RAM miss");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) }