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