^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 "evlist.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) #include "evsel.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) #include "parse-events.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) #include "tests.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) #include "debug.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) #include <errno.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) #include <linux/kernel.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) static int perf_evsel__roundtrip_cache_name_test(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) char name[128];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) int type, op, err = 0, ret = 0, i, idx;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) struct evsel *evsel;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) struct evlist *evlist = evlist__new();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) if (evlist == NULL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) for (type = 0; type < PERF_COUNT_HW_CACHE_MAX; type++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) for (op = 0; op < PERF_COUNT_HW_CACHE_OP_MAX; op++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) /* skip invalid cache type */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) if (!evsel__is_cache_op_valid(type, op))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) for (i = 0; i < PERF_COUNT_HW_CACHE_RESULT_MAX; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) __evsel__hw_cache_type_op_res_name(type, op, i, name, sizeof(name));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) err = parse_events(evlist, name, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) ret = err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) idx = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) evsel = evlist__first(evlist);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) for (type = 0; type < PERF_COUNT_HW_CACHE_MAX; type++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) for (op = 0; op < PERF_COUNT_HW_CACHE_OP_MAX; op++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) /* skip invalid cache type */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) if (!evsel__is_cache_op_valid(type, op))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) for (i = 0; i < PERF_COUNT_HW_CACHE_RESULT_MAX; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) __evsel__hw_cache_type_op_res_name(type, op, i, name, sizeof(name));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) if (evsel->idx != idx)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) ++idx;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) if (strcmp(evsel__name(evsel), name)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) pr_debug("%s != %s\n", evsel__name(evsel), name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) ret = -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) evsel = evsel__next(evsel);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) evlist__delete(evlist);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) static int __perf_evsel__name_array_test(const char *names[], int nr_names)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) int i, err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) struct evsel *evsel;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) struct evlist *evlist = evlist__new();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) if (evlist == NULL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) for (i = 0; i < nr_names; ++i) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) err = parse_events(evlist, names[i], NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) if (err) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) pr_debug("failed to parse event '%s', err %d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) names[i], err);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) goto out_delete_evlist;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) err = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) evlist__for_each_entry(evlist, evsel) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) if (strcmp(evsel__name(evsel), names[evsel->idx])) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) --err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) pr_debug("%s != %s\n", evsel__name(evsel), names[evsel->idx]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) out_delete_evlist:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) evlist__delete(evlist);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) #define perf_evsel__name_array_test(names) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) __perf_evsel__name_array_test(names, ARRAY_SIZE(names))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) int test__perf_evsel__roundtrip_name_test(struct test *test __maybe_unused, int subtest __maybe_unused)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) int err = 0, ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) err = perf_evsel__name_array_test(evsel__hw_names);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) ret = err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) err = __perf_evsel__name_array_test(evsel__sw_names, PERF_COUNT_SW_DUMMY + 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) ret = err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) err = perf_evsel__roundtrip_cache_name_test();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) ret = err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) }