|
@@ -564,3 +564,76 @@ void perf_pmu__set_format(unsigned long *bits, long from, long to)
|
|
|
for (b = from; b <= to; b++)
|
|
|
set_bit(b, bits);
|
|
|
}
|
|
|
+
|
|
|
+static char *format_alias(char *buf, int len, struct perf_pmu *pmu,
|
|
|
+ struct perf_pmu_alias *alias)
|
|
|
+{
|
|
|
+ snprintf(buf, len, "%s/%s/", pmu->name, alias->name);
|
|
|
+ return buf;
|
|
|
+}
|
|
|
+
|
|
|
+static char *format_alias_or(char *buf, int len, struct perf_pmu *pmu,
|
|
|
+ struct perf_pmu_alias *alias)
|
|
|
+{
|
|
|
+ snprintf(buf, len, "%s OR %s/%s/", alias->name, pmu->name, alias->name);
|
|
|
+ return buf;
|
|
|
+}
|
|
|
+
|
|
|
+static int cmp_string(const void *a, const void *b)
|
|
|
+{
|
|
|
+ const char * const *as = a;
|
|
|
+ const char * const *bs = b;
|
|
|
+ return strcmp(*as, *bs);
|
|
|
+}
|
|
|
+
|
|
|
+void print_pmu_events(const char *event_glob, bool name_only)
|
|
|
+{
|
|
|
+ struct perf_pmu *pmu;
|
|
|
+ struct perf_pmu_alias *alias;
|
|
|
+ char buf[1024];
|
|
|
+ int printed = 0;
|
|
|
+ int len, j;
|
|
|
+ char **aliases;
|
|
|
+
|
|
|
+ pmu = NULL;
|
|
|
+ len = 0;
|
|
|
+ while ((pmu = perf_pmu__scan(pmu)) != NULL)
|
|
|
+ list_for_each_entry(alias, &pmu->aliases, list)
|
|
|
+ len++;
|
|
|
+ aliases = malloc(sizeof(char *) * len);
|
|
|
+ if (!aliases)
|
|
|
+ return;
|
|
|
+ pmu = NULL;
|
|
|
+ j = 0;
|
|
|
+ while ((pmu = perf_pmu__scan(pmu)) != NULL)
|
|
|
+ list_for_each_entry(alias, &pmu->aliases, list) {
|
|
|
+ char *name = format_alias(buf, sizeof(buf), pmu, alias);
|
|
|
+ bool is_cpu = !strcmp(pmu->name, "cpu");
|
|
|
+
|
|
|
+ if (event_glob != NULL &&
|
|
|
+ !(strglobmatch(name, event_glob) ||
|
|
|
+ (!is_cpu && strglobmatch(alias->name,
|
|
|
+ event_glob))))
|
|
|
+ continue;
|
|
|
+ aliases[j] = name;
|
|
|
+ if (is_cpu && !name_only)
|
|
|
+ aliases[j] = format_alias_or(buf, sizeof(buf),
|
|
|
+ pmu, alias);
|
|
|
+ aliases[j] = strdup(aliases[j]);
|
|
|
+ j++;
|
|
|
+ }
|
|
|
+ len = j;
|
|
|
+ qsort(aliases, len, sizeof(char *), cmp_string);
|
|
|
+ for (j = 0; j < len; j++) {
|
|
|
+ if (name_only) {
|
|
|
+ printf("%s ", aliases[j]);
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ printf(" %-50s [Kernel PMU event]\n", aliases[j]);
|
|
|
+ free(aliases[j]);
|
|
|
+ printed++;
|
|
|
+ }
|
|
|
+ if (printed)
|
|
|
+ printf("\n");
|
|
|
+ free(aliases);
|
|
|
+}
|