1 // SPDX-License-Identifier: GPL-2.0
7 #include <linux/stddef.h>
8 #include <linux/perf_event.h>
9 #include <linux/zalloc.h>
10 #include <api/fs/fs.h>
13 #include "../../../util/intel-pt.h"
14 #include "../../../util/intel-bts.h"
15 #include "../../../util/pmu.h"
16 #include "../../../util/fncache.h"
21 struct list_head list;
24 static LIST_HEAD(pmu_alias_name_list);
25 static bool cached_list;
27 struct perf_event_attr *perf_pmu__get_default_config(struct perf_pmu *pmu __maybe_unused)
29 #ifdef HAVE_AUXTRACE_SUPPORT
30 if (!strcmp(pmu->name, INTEL_PT_PMU_NAME)) {
32 return intel_pt_pmu_default_config(pmu);
34 if (!strcmp(pmu->name, INTEL_BTS_PMU_NAME)) {
36 pmu->selectable = true;
42 static void pmu_alias__delete(struct pmu_alias *pmu_alias)
47 zfree(&pmu_alias->name);
48 zfree(&pmu_alias->alias);
52 static struct pmu_alias *pmu_alias__new(char *name, char *alias)
54 struct pmu_alias *pmu_alias = zalloc(sizeof(*pmu_alias));
57 pmu_alias->name = strdup(name);
61 pmu_alias->alias = strdup(alias);
62 if (!pmu_alias->alias)
68 pmu_alias__delete(pmu_alias);
72 static int setup_pmu_alias_list(void)
77 struct pmu_alias *pmu_alias;
78 char buf[MAX_PMU_NAME_LEN];
82 dirfd = perf_pmu__event_source_devices_fd();
86 dir = fdopendir(dirfd);
90 while ((dent = readdir(dir))) {
91 if (!strcmp(dent->d_name, ".") ||
92 !strcmp(dent->d_name, ".."))
95 fd = perf_pmu__pathname_fd(dirfd, dent->d_name, "alias", O_RDONLY);
99 file = fdopen(fd, "r");
103 if (!fgets(buf, sizeof(buf), file)) {
110 /* Remove the last '\n' */
111 buf[strlen(buf) - 1] = 0;
113 pmu_alias = pmu_alias__new(dent->d_name, buf);
117 list_add_tail(&pmu_alias->list, &pmu_alias_name_list);
127 static char *__pmu_find_real_name(const char *name)
129 struct pmu_alias *pmu_alias;
131 list_for_each_entry(pmu_alias, &pmu_alias_name_list, list) {
132 if (!strcmp(name, pmu_alias->alias))
133 return pmu_alias->name;
139 char *pmu_find_real_name(const char *name)
142 return __pmu_find_real_name(name);
144 setup_pmu_alias_list();
147 return __pmu_find_real_name(name);
150 static char *__pmu_find_alias_name(const char *name)
152 struct pmu_alias *pmu_alias;
154 list_for_each_entry(pmu_alias, &pmu_alias_name_list, list) {
155 if (!strcmp(name, pmu_alias->name))
156 return pmu_alias->alias;
161 char *pmu_find_alias_name(const char *name)
164 return __pmu_find_alias_name(name);
166 setup_pmu_alias_list();
169 return __pmu_find_alias_name(name);