1 // SPDX-License-Identifier: GPL-2.0
2 #include <linux/list.h>
3 #include <linux/compiler.h>
4 #include <linux/string.h>
5 #include <linux/zalloc.h>
6 #include <linux/ctype.h>
14 #include <api/fs/fs.h>
21 #include "hwmon_pmu.h"
24 #include <util/pmu-bison.h>
25 #include <util/pmu-flex.h>
26 #include "parse-events.h"
27 #include "print-events.h"
32 #include "util/evsel_config.h"
35 #define UNIT_MAX_LEN 31 /* max length for event unit name */
38 /* An event loaded from /sys/devices/<pmu>/events. */
40 /* An event loaded from a CPUID matched json file. */
43 * An event loaded from a /sys/devices/<pmu>/identifier matched json
50 * struct perf_pmu_alias - An event either read from sysfs or builtin in
51 * pmu-events.c, created by parsing the pmu-events json files.
53 struct perf_pmu_alias
{
54 /** @name: Name of the event like "mem-loads". */
56 /** @desc: Optional short description of the event. */
58 /** @long_desc: Optional long description. */
61 * @topic: Optional topic such as cache or pipeline, particularly for
65 /** @terms: Owned list of the original parsed parameters. */
66 struct parse_events_terms terms
;
67 /** @list: List element of struct perf_pmu aliases. */
68 struct list_head list
;
70 * @pmu_name: The name copied from the json struct pmu_event. This can
71 * differ from the PMU name as it won't have suffixes.
74 /** @unit: Units for the event, such as bytes or cache lines. */
75 char unit
[UNIT_MAX_LEN
+1];
76 /** @scale: Value to scale read counter values by. */
79 * @per_pkg: Does the file
80 * <sysfs>/bus/event_source/devices/<pmu_name>/events/<name>.per-pkg or
81 * equivalent json value exist and have the value 1.
85 * @snapshot: Does the file
86 * <sysfs>/bus/event_source/devices/<pmu_name>/events/<name>.snapshot
87 * exist and have the value 1.
91 * @deprecated: Is the event hidden and so not shown in perf list by
95 /** @from_sysfs: Was the alias from sysfs or a json event? */
97 /** @info_loaded: Have the scale, unit and other values been read from disk? */
102 * struct perf_pmu_format - Values from a format file read from
103 * <sysfs>/devices/cpu/format/ held in struct perf_pmu.
105 * For example, the contents of <sysfs>/devices/cpu/format/event may be
106 * "config:0-7" and will be represented here as name="event",
107 * value=PERF_PMU_FORMAT_VALUE_CONFIG and bits 0 to 7 will be set.
109 struct perf_pmu_format
{
110 /** @list: Element on list within struct perf_pmu. */
111 struct list_head list
;
112 /** @bits: Which config bits are set by this format value. */
113 DECLARE_BITMAP(bits
, PERF_PMU_FORMAT_BITS
);
114 /** @name: The modifier/file name. */
117 * @value : Which config value the format relates to. Supported values
118 * are from PERF_PMU_FORMAT_VALUE_CONFIG to
119 * PERF_PMU_FORMAT_VALUE_CONFIG_END.
122 /** @loaded: Has the contents been loaded/parsed. */
126 static int pmu_aliases_parse(struct perf_pmu
*pmu
);
128 static struct perf_pmu_format
*perf_pmu__new_format(struct list_head
*list
, char *name
)
130 struct perf_pmu_format
*format
;
132 format
= zalloc(sizeof(*format
));
136 format
->name
= strdup(name
);
141 list_add_tail(&format
->list
, list
);
145 /* Called at the end of parsing a format. */
146 void perf_pmu_format__set_value(void *vformat
, int config
, unsigned long *bits
)
148 struct perf_pmu_format
*format
= vformat
;
150 format
->value
= config
;
151 memcpy(format
->bits
, bits
, sizeof(format
->bits
));
154 static void __perf_pmu_format__load(struct perf_pmu_format
*format
, FILE *file
)
159 ret
= perf_pmu_lex_init(&scanner
);
163 perf_pmu_set_in(file
, scanner
);
164 ret
= perf_pmu_parse(format
, scanner
);
165 perf_pmu_lex_destroy(scanner
);
166 format
->loaded
= true;
169 static void perf_pmu_format__load(const struct perf_pmu
*pmu
, struct perf_pmu_format
*format
)
177 if (!perf_pmu__pathname_scnprintf(path
, sizeof(path
), pmu
->name
, "format"))
180 assert(strlen(path
) + strlen(format
->name
) + 2 < sizeof(path
));
182 strcat(path
, format
->name
);
184 file
= fopen(path
, "r");
187 __perf_pmu_format__load(format
, file
);
192 * Parse & process all the sysfs attributes located under
193 * the directory specified in 'dir' parameter.
195 static int perf_pmu__format_parse(struct perf_pmu
*pmu
, int dirfd
, bool eager_load
)
197 struct dirent
*evt_ent
;
201 format_dir
= fdopendir(dirfd
);
205 while ((evt_ent
= readdir(format_dir
)) != NULL
) {
206 struct perf_pmu_format
*format
;
207 char *name
= evt_ent
->d_name
;
209 if (!strcmp(name
, ".") || !strcmp(name
, ".."))
212 format
= perf_pmu__new_format(&pmu
->format
, name
);
220 int fd
= openat(dirfd
, name
, O_RDONLY
);
226 file
= fdopen(fd
, "r");
231 __perf_pmu_format__load(format
, file
);
236 closedir(format_dir
);
241 * Reading/parsing the default pmu format definition, which should be
243 * /sys/bus/event_source/devices/<dev>/format as sysfs group attributes.
245 static int pmu_format(struct perf_pmu
*pmu
, int dirfd
, const char *name
, bool eager_load
)
249 fd
= perf_pmu__pathname_fd(dirfd
, name
, "format", O_DIRECTORY
);
253 /* it'll close the fd */
254 if (perf_pmu__format_parse(pmu
, fd
, eager_load
))
260 int perf_pmu__convert_scale(const char *scale
, char **end
, double *sval
)
266 * save current locale
268 lc
= setlocale(LC_NUMERIC
, NULL
);
271 * The lc string may be allocated in static storage,
272 * so get a dynamic copy to make it survive setlocale
282 * force to C locale to ensure kernel
283 * scale string is converted correctly.
284 * kernel uses default C locale.
286 setlocale(LC_NUMERIC
, "C");
288 *sval
= strtod(scale
, end
);
292 setlocale(LC_NUMERIC
, lc
);
297 static int perf_pmu__parse_scale(struct perf_pmu
*pmu
, struct perf_pmu_alias
*alias
)
306 len
= perf_pmu__event_source_devices_scnprintf(path
, sizeof(path
));
309 scnprintf(path
+ len
, sizeof(path
) - len
, "%s/events/%s.scale", pmu
->name
, alias
->name
);
311 fd
= open(path
, O_RDONLY
);
315 if (fstat(fd
, &st
) < 0)
318 sret
= read(fd
, scale
, sizeof(scale
)-1);
322 if (scale
[sret
- 1] == '\n')
323 scale
[sret
- 1] = '\0';
327 ret
= perf_pmu__convert_scale(scale
, NULL
, &alias
->scale
);
333 static int perf_pmu__parse_unit(struct perf_pmu
*pmu
, struct perf_pmu_alias
*alias
)
341 len
= perf_pmu__event_source_devices_scnprintf(path
, sizeof(path
));
344 scnprintf(path
+ len
, sizeof(path
) - len
, "%s/events/%s.unit", pmu
->name
, alias
->name
);
346 fd
= open(path
, O_RDONLY
);
350 sret
= read(fd
, alias
->unit
, UNIT_MAX_LEN
);
356 if (alias
->unit
[sret
- 1] == '\n')
357 alias
->unit
[sret
- 1] = '\0';
359 alias
->unit
[sret
] = '\0';
364 alias
->unit
[0] = '\0';
368 static bool perf_pmu__parse_event_source_bool(const char *pmu_name
, const char *event_name
,
375 len
= perf_pmu__event_source_devices_scnprintf(path
, sizeof(path
));
379 scnprintf(path
+ len
, sizeof(path
) - len
, "%s/events/%s.%s", pmu_name
, event_name
, suffix
);
381 fd
= open(path
, O_RDONLY
);
389 len
= read(fd
, buf
, sizeof(buf
));
390 assert(len
== 1 || len
== 2);
391 assert(buf
[0] == '1');
399 static void perf_pmu__parse_per_pkg(struct perf_pmu
*pmu
, struct perf_pmu_alias
*alias
)
401 alias
->per_pkg
= perf_pmu__parse_event_source_bool(pmu
->name
, alias
->name
, "per-pkg");
404 static void perf_pmu__parse_snapshot(struct perf_pmu
*pmu
, struct perf_pmu_alias
*alias
)
406 alias
->snapshot
= perf_pmu__parse_event_source_bool(pmu
->name
, alias
->name
, "snapshot");
409 /* Delete an alias entry. */
410 static void perf_pmu_free_alias(struct perf_pmu_alias
*newalias
)
412 zfree(&newalias
->name
);
413 zfree(&newalias
->desc
);
414 zfree(&newalias
->long_desc
);
415 zfree(&newalias
->topic
);
416 zfree(&newalias
->pmu_name
);
417 parse_events_terms__exit(&newalias
->terms
);
421 static void perf_pmu__del_aliases(struct perf_pmu
*pmu
)
423 struct perf_pmu_alias
*alias
, *tmp
;
425 list_for_each_entry_safe(alias
, tmp
, &pmu
->aliases
, list
) {
426 list_del(&alias
->list
);
427 perf_pmu_free_alias(alias
);
431 static struct perf_pmu_alias
*perf_pmu__find_alias(struct perf_pmu
*pmu
,
435 struct perf_pmu_alias
*alias
;
437 if (load
&& !pmu
->sysfs_aliases_loaded
) {
438 bool has_sysfs_event
;
439 char event_file_name
[FILENAME_MAX
+ 8];
442 * Test if alias/event 'name' exists in the PMU's sysfs/events
443 * directory. If not skip parsing the sysfs aliases. Sysfs event
444 * name must be all lower or all upper case.
446 scnprintf(event_file_name
, sizeof(event_file_name
), "events/%s", name
);
447 for (size_t i
= 7, n
= 7 + strlen(name
); i
< n
; i
++)
448 event_file_name
[i
] = tolower(event_file_name
[i
]);
450 has_sysfs_event
= perf_pmu__file_exists(pmu
, event_file_name
);
451 if (!has_sysfs_event
) {
452 for (size_t i
= 7, n
= 7 + strlen(name
); i
< n
; i
++)
453 event_file_name
[i
] = toupper(event_file_name
[i
]);
455 has_sysfs_event
= perf_pmu__file_exists(pmu
, event_file_name
);
458 pmu_aliases_parse(pmu
);
461 list_for_each_entry(alias
, &pmu
->aliases
, list
) {
462 if (!strcasecmp(alias
->name
, name
))
468 static bool assign_str(const char *name
, const char *field
, char **old_str
,
471 if (!*old_str
&& new_str
) {
472 *old_str
= strdup(new_str
);
476 if (!new_str
|| !strcasecmp(*old_str
, new_str
))
477 return false; /* Nothing to update. */
479 pr_debug("alias %s differs in field '%s' ('%s' != '%s')\n",
480 name
, field
, *old_str
, new_str
);
482 *old_str
= strdup(new_str
);
486 static void read_alias_info(struct perf_pmu
*pmu
, struct perf_pmu_alias
*alias
)
488 if (!alias
->from_sysfs
|| alias
->info_loaded
)
492 * load unit name and scale if available
494 perf_pmu__parse_unit(pmu
, alias
);
495 perf_pmu__parse_scale(pmu
, alias
);
496 perf_pmu__parse_per_pkg(pmu
, alias
);
497 perf_pmu__parse_snapshot(pmu
, alias
);
500 struct update_alias_data
{
501 struct perf_pmu
*pmu
;
502 struct perf_pmu_alias
*alias
;
505 static int update_alias(const struct pmu_event
*pe
,
506 const struct pmu_events_table
*table __maybe_unused
,
509 struct update_alias_data
*data
= vdata
;
512 read_alias_info(data
->pmu
, data
->alias
);
513 assign_str(pe
->name
, "desc", &data
->alias
->desc
, pe
->desc
);
514 assign_str(pe
->name
, "long_desc", &data
->alias
->long_desc
, pe
->long_desc
);
515 assign_str(pe
->name
, "topic", &data
->alias
->topic
, pe
->topic
);
516 data
->alias
->per_pkg
= pe
->perpkg
;
518 parse_events_terms__exit(&data
->alias
->terms
);
519 ret
= parse_events_terms(&data
->alias
->terms
, pe
->event
, /*input=*/NULL
);
521 if (!ret
&& pe
->unit
) {
524 ret
= perf_pmu__convert_scale(pe
->unit
, &unit
, &data
->alias
->scale
);
526 snprintf(data
->alias
->unit
, sizeof(data
->alias
->unit
), "%s", unit
);
531 static int perf_pmu__new_alias(struct perf_pmu
*pmu
, const char *name
,
532 const char *desc
, const char *val
, FILE *val_fd
,
533 const struct pmu_event
*pe
, enum event_source src
)
535 struct perf_pmu_alias
*alias
;
537 const char *long_desc
= NULL
, *topic
= NULL
, *unit
= NULL
, *pmu_name
= NULL
;
538 bool deprecated
= false, perpkg
= false;
540 if (perf_pmu__find_alias(pmu
, name
, /*load=*/ false)) {
541 /* Alias was already created/loaded. */
546 long_desc
= pe
->long_desc
;
550 deprecated
= pe
->deprecated
;
551 if (pe
->pmu
&& strcmp(pe
->pmu
, "default_core"))
555 alias
= zalloc(sizeof(*alias
));
559 parse_events_terms__init(&alias
->terms
);
561 alias
->unit
[0] = '\0';
562 alias
->per_pkg
= perpkg
;
563 alias
->snapshot
= false;
564 alias
->deprecated
= deprecated
;
566 ret
= parse_events_terms(&alias
->terms
, val
, val_fd
);
568 pr_err("Cannot parse alias %s: %d\n", val
, ret
);
573 alias
->name
= strdup(name
);
574 alias
->desc
= desc
? strdup(desc
) : NULL
;
575 alias
->long_desc
= long_desc
? strdup(long_desc
) :
576 desc
? strdup(desc
) : NULL
;
577 alias
->topic
= topic
? strdup(topic
) : NULL
;
578 alias
->pmu_name
= pmu_name
? strdup(pmu_name
) : NULL
;
580 if (perf_pmu__convert_scale(unit
, (char **)&unit
, &alias
->scale
) < 0) {
581 perf_pmu_free_alias(alias
);
584 snprintf(alias
->unit
, sizeof(alias
->unit
), "%s", unit
);
588 case EVENT_SRC_SYSFS
:
589 alias
->from_sysfs
= true;
590 if (pmu
->events_table
) {
591 /* Update an event from sysfs with json data. */
592 struct update_alias_data data
= {
596 if (pmu_events_table__find_event(pmu
->events_table
, pmu
, name
,
597 update_alias
, &data
) == 0)
598 pmu
->cpu_json_aliases
++;
600 pmu
->sysfs_aliases
++;
602 case EVENT_SRC_CPU_JSON
:
603 pmu
->cpu_json_aliases
++;
605 case EVENT_SRC_SYS_JSON
:
606 pmu
->sys_json_aliases
++;
610 list_add_tail(&alias
->list
, &pmu
->aliases
);
614 static inline bool pmu_alias_info_file(const char *name
)
619 if (len
> 5 && !strcmp(name
+ len
- 5, ".unit"))
621 if (len
> 6 && !strcmp(name
+ len
- 6, ".scale"))
623 if (len
> 8 && !strcmp(name
+ len
- 8, ".per-pkg"))
625 if (len
> 9 && !strcmp(name
+ len
- 9, ".snapshot"))
632 * Reading the pmu event aliases definition, which should be located at:
633 * /sys/bus/event_source/devices/<dev>/events as sysfs group attributes.
635 static int __pmu_aliases_parse(struct perf_pmu
*pmu
, int events_dir_fd
)
637 struct dirent
*evt_ent
;
640 event_dir
= fdopendir(events_dir_fd
);
644 while ((evt_ent
= readdir(event_dir
))) {
645 char *name
= evt_ent
->d_name
;
649 if (!strcmp(name
, ".") || !strcmp(name
, ".."))
653 * skip info files parsed in perf_pmu__new_alias()
655 if (pmu_alias_info_file(name
))
658 fd
= openat(events_dir_fd
, name
, O_RDONLY
);
660 pr_debug("Cannot open %s\n", name
);
663 file
= fdopen(fd
, "r");
669 if (perf_pmu__new_alias(pmu
, name
, /*desc=*/ NULL
,
670 /*val=*/ NULL
, file
, /*pe=*/ NULL
,
671 EVENT_SRC_SYSFS
) < 0)
672 pr_debug("Cannot set up %s\n", name
);
677 pmu
->sysfs_aliases_loaded
= true;
681 static int pmu_aliases_parse(struct perf_pmu
*pmu
)
685 int events_dir_fd
, ret
;
687 if (pmu
->sysfs_aliases_loaded
)
690 len
= perf_pmu__event_source_devices_scnprintf(path
, sizeof(path
));
693 scnprintf(path
+ len
, sizeof(path
) - len
, "%s/events", pmu
->name
);
695 events_dir_fd
= open(path
, O_DIRECTORY
);
696 if (events_dir_fd
== -1) {
697 pmu
->sysfs_aliases_loaded
= true;
700 ret
= __pmu_aliases_parse(pmu
, events_dir_fd
);
701 close(events_dir_fd
);
705 static int pmu_aliases_parse_eager(struct perf_pmu
*pmu
, int sysfs_fd
)
707 char path
[FILENAME_MAX
+ 7];
708 int ret
, events_dir_fd
;
710 scnprintf(path
, sizeof(path
), "%s/events", pmu
->name
);
711 events_dir_fd
= openat(sysfs_fd
, path
, O_DIRECTORY
, 0);
712 if (events_dir_fd
== -1) {
713 pmu
->sysfs_aliases_loaded
= true;
716 ret
= __pmu_aliases_parse(pmu
, events_dir_fd
);
717 close(events_dir_fd
);
721 static int pmu_alias_terms(struct perf_pmu_alias
*alias
, int err_loc
, struct list_head
*terms
)
723 struct parse_events_term
*term
, *cloned
;
724 struct parse_events_terms clone_terms
;
726 parse_events_terms__init(&clone_terms
);
727 list_for_each_entry(term
, &alias
->terms
.terms
, list
) {
728 int ret
= parse_events_term__clone(&cloned
, term
);
731 parse_events_terms__exit(&clone_terms
);
735 * Weak terms don't override command line options,
736 * which we don't want for implicit terms in aliases.
739 cloned
->err_term
= cloned
->err_val
= err_loc
;
740 list_add_tail(&cloned
->list
, &clone_terms
.terms
);
742 list_splice_init(&clone_terms
.terms
, terms
);
743 parse_events_terms__exit(&clone_terms
);
748 * Uncore PMUs have a "cpumask" file under sysfs. CPU PMUs (e.g. on arm/arm64)
749 * may have a "cpus" file.
751 static struct perf_cpu_map
*pmu_cpumask(int dirfd
, const char *name
, bool is_core
)
753 struct perf_cpu_map
*cpus
;
754 const char *templates
[] = {
759 const char **template;
760 char pmu_name
[PATH_MAX
];
761 struct perf_pmu pmu
= {.name
= pmu_name
};
764 strlcpy(pmu_name
, name
, sizeof(pmu_name
));
765 for (template = templates
; *template; template++) {
766 file
= perf_pmu__open_file_at(&pmu
, dirfd
, *template);
769 cpus
= perf_cpu_map__read(file
);
775 /* Nothing found, for core PMUs assume this means all CPUs. */
776 return is_core
? perf_cpu_map__get(cpu_map__online()) : NULL
;
779 static bool pmu_is_uncore(int dirfd
, const char *name
)
783 fd
= perf_pmu__pathname_fd(dirfd
, name
, "cpumask", O_PATH
);
791 static char *pmu_id(const char *name
)
793 char path
[PATH_MAX
], *str
;
796 perf_pmu__pathname_scnprintf(path
, sizeof(path
), name
, "identifier");
798 if (filename__read_str(path
, &str
, &len
) < 0)
801 str
[len
- 1] = 0; /* remove line feed */
807 * is_sysfs_pmu_core() - PMU CORE devices have different name other than cpu in
808 * sysfs on some platforms like ARM or Intel hybrid. Looking for
809 * possible the cpus file in sysfs files to identify whether this is a
811 * @name: The PMU name such as "cpu_atom".
813 static int is_sysfs_pmu_core(const char *name
)
817 if (!perf_pmu__pathname_scnprintf(path
, sizeof(path
), name
, "cpus"))
819 return file_available(path
);
823 * Return the length of the PMU name not including the suffix for uncore PMUs.
825 * We want to deduplicate many similar uncore PMUs by stripping their suffixes,
826 * but there are never going to be too many core PMUs and the suffixes might be
827 * interesting. "arm_cortex_a53" vs "arm_cortex_a57" or "cpum_cf" for example.
829 * @skip_duplicate_pmus: False in verbose mode so all uncore PMUs are visible
831 static size_t pmu_deduped_name_len(const struct perf_pmu
*pmu
, const char *name
,
832 bool skip_duplicate_pmus
)
834 return skip_duplicate_pmus
&& !pmu
->is_core
835 ? pmu_name_len_no_suffix(name
)
840 * perf_pmu__match_ignoring_suffix - Does the pmu_name match tok ignoring any
841 * trailing suffix? The Suffix must be in form
842 * tok_{digits}, or tok{digits}.
843 * @pmu_name: The pmu_name with possible suffix.
844 * @tok: The possible match to pmu_name without suffix.
846 static bool perf_pmu__match_ignoring_suffix(const char *pmu_name
, const char *tok
)
848 const char *p
, *suffix
;
849 bool has_hex
= false;
851 if (strncmp(pmu_name
, tok
, strlen(tok
)))
854 suffix
= p
= pmu_name
+ strlen(tok
);
863 /* Ensure we end in a number */
868 has_hex
= !isdigit(*p
);
874 return (p
- suffix
) > 2;
880 * pmu_uncore_alias_match - does name match the PMU name?
881 * @pmu_name: the json struct pmu_event name. This may lack a suffix (which
882 * matches) or be of the form "socket,pmuname" which will match
883 * "socketX_pmunameY".
884 * @name: a real full PMU name as from sysfs.
886 static bool pmu_uncore_alias_match(const char *pmu_name
, const char *name
)
888 char *tmp
= NULL
, *tok
, *str
;
891 if (strchr(pmu_name
, ',') == NULL
)
892 return perf_pmu__match_ignoring_suffix(name
, pmu_name
);
894 str
= strdup(pmu_name
);
899 * uncore alias may be from different PMU with common prefix
901 tok
= strtok_r(str
, ",", &tmp
);
902 if (strncmp(pmu_name
, tok
, strlen(tok
))) {
908 * Match more complex aliases where the alias name is a comma-delimited
909 * list of tokens, orderly contained in the matching PMU name.
911 * Example: For alias "socket,pmuname" and PMU "socketX_pmunameY", we
912 * match "socket" in "socketX_pmunameY" and then "pmuname" in
916 char *next_tok
= strtok_r(NULL
, ",", &tmp
);
918 name
= strstr(name
, tok
);
920 (!next_tok
&& !perf_pmu__match_ignoring_suffix(name
, tok
))) {
936 bool pmu_uncore_identifier_match(const char *compat
, const char *id
)
939 regmatch_t pmatch
[1];
942 if (regcomp(&re
, compat
, REG_EXTENDED
) != 0) {
943 /* Warn unable to generate match particular string. */
944 pr_info("Invalid regular expression %s\n", compat
);
948 match
= !regexec(&re
, id
, 1, pmatch
, 0);
950 /* Ensure a full match. */
951 match
= pmatch
[0].rm_so
== 0 && (size_t)pmatch
[0].rm_eo
== strlen(id
);
958 static int pmu_add_cpu_aliases_map_callback(const struct pmu_event
*pe
,
959 const struct pmu_events_table
*table __maybe_unused
,
962 struct perf_pmu
*pmu
= vdata
;
964 perf_pmu__new_alias(pmu
, pe
->name
, pe
->desc
, pe
->event
, /*val_fd=*/ NULL
,
965 pe
, EVENT_SRC_CPU_JSON
);
970 * From the pmu_events_table, find the events that correspond to the given
971 * PMU and add them to the list 'head'.
973 void pmu_add_cpu_aliases_table(struct perf_pmu
*pmu
, const struct pmu_events_table
*table
)
975 pmu_events_table__for_each_event(table
, pmu
, pmu_add_cpu_aliases_map_callback
, pmu
);
978 static void pmu_add_cpu_aliases(struct perf_pmu
*pmu
)
980 if (!pmu
->events_table
)
983 if (pmu
->cpu_aliases_added
)
986 pmu_add_cpu_aliases_table(pmu
, pmu
->events_table
);
987 pmu
->cpu_aliases_added
= true;
990 static int pmu_add_sys_aliases_iter_fn(const struct pmu_event
*pe
,
991 const struct pmu_events_table
*table __maybe_unused
,
994 struct perf_pmu
*pmu
= vdata
;
996 if (!pe
->compat
|| !pe
->pmu
)
999 if (pmu_uncore_alias_match(pe
->pmu
, pmu
->name
) &&
1000 pmu_uncore_identifier_match(pe
->compat
, pmu
->id
)) {
1001 perf_pmu__new_alias(pmu
,
1007 EVENT_SRC_SYS_JSON
);
1013 void pmu_add_sys_aliases(struct perf_pmu
*pmu
)
1018 pmu_for_each_sys_event(pmu_add_sys_aliases_iter_fn
, pmu
);
1021 static char *pmu_find_alias_name(struct perf_pmu
*pmu
, int dirfd
)
1023 FILE *file
= perf_pmu__open_file_at(pmu
, dirfd
, "alias");
1025 size_t line_len
= 0;
1031 ret
= getline(&line
, &line_len
, file
);
1036 /* Remove trailing newline. */
1037 if (ret
> 0 && line
[ret
- 1] == '\n')
1044 static int pmu_max_precise(int dirfd
, struct perf_pmu
*pmu
)
1046 int max_precise
= -1;
1048 perf_pmu__scan_file_at(pmu
, dirfd
, "caps/max_precise", "%d", &max_precise
);
1053 perf_pmu__arch_init(struct perf_pmu
*pmu
)
1056 pmu
->mem_events
= perf_mem_events
;
1059 struct perf_pmu
*perf_pmu__lookup(struct list_head
*pmus
, int dirfd
, const char *name
,
1062 struct perf_pmu
*pmu
;
1065 pmu
= zalloc(sizeof(*pmu
));
1069 pmu
->name
= strdup(name
);
1074 * Read type early to fail fast if a lookup name isn't a PMU. Ensure
1075 * that type value is successfully assigned (return 1).
1077 if (perf_pmu__scan_file_at(pmu
, dirfd
, "type", "%u", &type
) != 1)
1080 INIT_LIST_HEAD(&pmu
->format
);
1081 INIT_LIST_HEAD(&pmu
->aliases
);
1082 INIT_LIST_HEAD(&pmu
->caps
);
1085 * The pmu data we store & need consists of the pmu
1086 * type value and format definitions. Load both right
1089 if (pmu_format(pmu
, dirfd
, name
, eager_load
))
1092 pmu
->is_core
= is_pmu_core(name
);
1093 pmu
->cpus
= pmu_cpumask(dirfd
, name
, pmu
->is_core
);
1096 pmu
->is_uncore
= pmu_is_uncore(dirfd
, name
);
1098 pmu
->id
= pmu_id(name
);
1099 pmu
->max_precise
= pmu_max_precise(dirfd
, pmu
);
1100 pmu
->alias_name
= pmu_find_alias_name(pmu
, dirfd
);
1101 pmu
->events_table
= perf_pmu__find_events_table(pmu
);
1103 * Load the sys json events/aliases when loading the PMU as each event
1104 * may have a different compat regular expression. We therefore can't
1105 * know the number of sys json events/aliases without computing the
1106 * regular expressions for them all.
1108 pmu_add_sys_aliases(pmu
);
1109 list_add_tail(&pmu
->list
, pmus
);
1111 perf_pmu__arch_init(pmu
);
1114 pmu_aliases_parse_eager(pmu
, dirfd
);
1123 /* Creates the PMU when sysfs scanning fails. */
1124 struct perf_pmu
*perf_pmu__create_placeholder_core_pmu(struct list_head
*core_pmus
)
1126 struct perf_pmu
*pmu
= zalloc(sizeof(*pmu
));
1131 pmu
->name
= strdup("cpu");
1137 pmu
->is_core
= true;
1138 pmu
->type
= PERF_TYPE_RAW
;
1139 pmu
->cpus
= cpu_map__online();
1141 INIT_LIST_HEAD(&pmu
->format
);
1142 INIT_LIST_HEAD(&pmu
->aliases
);
1143 INIT_LIST_HEAD(&pmu
->caps
);
1144 list_add_tail(&pmu
->list
, core_pmus
);
1148 bool perf_pmu__is_fake(const struct perf_pmu
*pmu
)
1150 return pmu
->type
== PERF_PMU_TYPE_FAKE
;
1153 void perf_pmu__warn_invalid_formats(struct perf_pmu
*pmu
)
1155 struct perf_pmu_format
*format
;
1157 if (pmu
->formats_checked
)
1160 pmu
->formats_checked
= true;
1162 /* fake pmu doesn't have format list */
1163 if (perf_pmu__is_fake(pmu
))
1166 list_for_each_entry(format
, &pmu
->format
, list
) {
1167 perf_pmu_format__load(pmu
, format
);
1168 if (format
->value
>= PERF_PMU_FORMAT_VALUE_CONFIG_END
) {
1169 pr_warning("WARNING: '%s' format '%s' requires 'perf_event_attr::config%d'"
1170 "which is not supported by this version of perf!\n",
1171 pmu
->name
, format
->name
, format
->value
);
1177 bool evsel__is_aux_event(const struct evsel
*evsel
)
1179 struct perf_pmu
*pmu
;
1181 if (evsel
->needs_auxtrace_mmap
)
1184 pmu
= evsel__find_pmu(evsel
);
1185 return pmu
&& pmu
->auxtrace
;
1189 * Set @config_name to @val as long as the user hasn't already set or cleared it
1190 * by passing a config term on the command line.
1192 * @val is the value to put into the bits specified by @config_name rather than
1193 * the bit pattern. It is shifted into position by this function, so to set
1194 * something to true, pass 1 for val rather than a pre shifted value.
1196 #define field_prep(_mask, _val) (((_val) << (ffsll(_mask) - 1)) & (_mask))
1197 void evsel__set_config_if_unset(struct perf_pmu
*pmu
, struct evsel
*evsel
,
1198 const char *config_name
, u64 val
)
1200 u64 user_bits
= 0, bits
;
1201 struct evsel_config_term
*term
= evsel__get_config_term(evsel
, CFG_CHG
);
1204 user_bits
= term
->val
.cfg_chg
;
1206 bits
= perf_pmu__format_bits(pmu
, config_name
);
1208 /* Do nothing if the user changed the value */
1209 if (bits
& user_bits
)
1212 /* Otherwise replace it */
1213 evsel
->core
.attr
.config
&= ~bits
;
1214 evsel
->core
.attr
.config
|= field_prep(bits
, val
);
1217 static struct perf_pmu_format
*
1218 pmu_find_format(const struct list_head
*formats
, const char *name
)
1220 struct perf_pmu_format
*format
;
1222 list_for_each_entry(format
, formats
, list
)
1223 if (!strcmp(format
->name
, name
))
1229 __u64
perf_pmu__format_bits(struct perf_pmu
*pmu
, const char *name
)
1231 struct perf_pmu_format
*format
= pmu_find_format(&pmu
->format
, name
);
1238 for_each_set_bit(fbit
, format
->bits
, PERF_PMU_FORMAT_BITS
)
1239 bits
|= 1ULL << fbit
;
1244 int perf_pmu__format_type(struct perf_pmu
*pmu
, const char *name
)
1246 struct perf_pmu_format
*format
= pmu_find_format(&pmu
->format
, name
);
1251 perf_pmu_format__load(pmu
, format
);
1252 return format
->value
;
1256 * Sets value based on the format definition (format parameter)
1257 * and unformatted value (value parameter).
1259 static void pmu_format_value(unsigned long *format
, __u64 value
, __u64
*v
,
1262 unsigned long fbit
, vbit
;
1264 for (fbit
= 0, vbit
= 0; fbit
< PERF_PMU_FORMAT_BITS
; fbit
++) {
1266 if (!test_bit(fbit
, format
))
1269 if (value
& (1llu << vbit
++))
1270 *v
|= (1llu << fbit
);
1272 *v
&= ~(1llu << fbit
);
1276 static __u64
pmu_format_max_value(const unsigned long *format
)
1280 w
= bitmap_weight(format
, PERF_PMU_FORMAT_BITS
);
1284 return (1ULL << w
) - 1;
1289 * Term is a string term, and might be a param-term. Try to look up it's value
1290 * in the remaining terms.
1291 * - We have a term like "base-or-format-term=param-term",
1292 * - We need to find the value supplied for "param-term" (with param-term named
1293 * in a config string) later on in the term list.
1295 static int pmu_resolve_param_term(struct parse_events_term
*term
,
1296 struct parse_events_terms
*head_terms
,
1299 struct parse_events_term
*t
;
1301 list_for_each_entry(t
, &head_terms
->terms
, list
) {
1302 if (t
->type_val
== PARSE_EVENTS__TERM_TYPE_NUM
&&
1303 t
->config
&& !strcmp(t
->config
, term
->config
)) {
1305 *value
= t
->val
.num
;
1311 printf("Required parameter '%s' not specified\n", term
->config
);
1316 static char *pmu_formats_string(const struct list_head
*formats
)
1318 struct perf_pmu_format
*format
;
1320 struct strbuf buf
= STRBUF_INIT
;
1326 /* sysfs exported terms */
1327 list_for_each_entry(format
, formats
, list
)
1328 if (strbuf_addf(&buf
, i
++ ? ",%s" : "%s", format
->name
) < 0)
1331 str
= strbuf_detach(&buf
, NULL
);
1333 strbuf_release(&buf
);
1339 * Setup one of config[12] attr members based on the
1340 * user input data - term parameter.
1342 static int pmu_config_term(const struct perf_pmu
*pmu
,
1343 struct perf_event_attr
*attr
,
1344 struct parse_events_term
*term
,
1345 struct parse_events_terms
*head_terms
,
1346 bool zero
, bool apply_hardcoded
,
1347 struct parse_events_error
*err
)
1349 struct perf_pmu_format
*format
;
1354 * If this is a parameter we've already used for parameterized-eval,
1355 * skip it in normal eval.
1361 * Hardcoded terms are generally handled in event parsing, which
1362 * traditionally have had to handle not having a PMU. An alias may
1363 * have hard coded config values, optionally apply them below.
1365 if (parse_events__is_hardcoded_term(term
)) {
1366 /* Config terms set all bits in the config. */
1367 DECLARE_BITMAP(bits
, PERF_PMU_FORMAT_BITS
);
1369 if (!apply_hardcoded
)
1372 bitmap_fill(bits
, PERF_PMU_FORMAT_BITS
);
1374 switch (term
->type_term
) {
1375 case PARSE_EVENTS__TERM_TYPE_CONFIG
:
1376 assert(term
->type_val
== PARSE_EVENTS__TERM_TYPE_NUM
);
1377 pmu_format_value(bits
, term
->val
.num
, &attr
->config
, zero
);
1379 case PARSE_EVENTS__TERM_TYPE_CONFIG1
:
1380 assert(term
->type_val
== PARSE_EVENTS__TERM_TYPE_NUM
);
1381 pmu_format_value(bits
, term
->val
.num
, &attr
->config1
, zero
);
1383 case PARSE_EVENTS__TERM_TYPE_CONFIG2
:
1384 assert(term
->type_val
== PARSE_EVENTS__TERM_TYPE_NUM
);
1385 pmu_format_value(bits
, term
->val
.num
, &attr
->config2
, zero
);
1387 case PARSE_EVENTS__TERM_TYPE_CONFIG3
:
1388 assert(term
->type_val
== PARSE_EVENTS__TERM_TYPE_NUM
);
1389 pmu_format_value(bits
, term
->val
.num
, &attr
->config3
, zero
);
1391 case PARSE_EVENTS__TERM_TYPE_USER
: /* Not hardcoded. */
1393 case PARSE_EVENTS__TERM_TYPE_NAME
... PARSE_EVENTS__TERM_TYPE_HARDWARE
:
1394 /* Skip non-config terms. */
1402 format
= pmu_find_format(&pmu
->format
, term
->config
);
1404 char *pmu_term
= pmu_formats_string(&pmu
->format
);
1408 if (asprintf(&unknown_term
,
1409 "unknown term '%s' for pmu '%s'",
1410 term
->config
, pmu
->name
) < 0)
1411 unknown_term
= NULL
;
1412 help_msg
= parse_events_formats_error_string(pmu_term
);
1414 parse_events_error__handle(err
, term
->err_term
,
1418 pr_debug("%s (%s)\n", unknown_term
, help_msg
);
1424 perf_pmu_format__load(pmu
, format
);
1425 switch (format
->value
) {
1426 case PERF_PMU_FORMAT_VALUE_CONFIG
:
1429 case PERF_PMU_FORMAT_VALUE_CONFIG1
:
1430 vp
= &attr
->config1
;
1432 case PERF_PMU_FORMAT_VALUE_CONFIG2
:
1433 vp
= &attr
->config2
;
1435 case PERF_PMU_FORMAT_VALUE_CONFIG3
:
1436 vp
= &attr
->config3
;
1443 * Either directly use a numeric term, or try to translate string terms
1444 * using event parameters.
1446 if (term
->type_val
== PARSE_EVENTS__TERM_TYPE_NUM
) {
1447 if (term
->no_value
&&
1448 bitmap_weight(format
->bits
, PERF_PMU_FORMAT_BITS
) > 1) {
1450 parse_events_error__handle(err
, term
->err_val
,
1451 strdup("no value assigned for term"),
1457 val
= term
->val
.num
;
1458 } else if (term
->type_val
== PARSE_EVENTS__TERM_TYPE_STR
) {
1459 if (strcmp(term
->val
.str
, "?")) {
1461 pr_info("Invalid sysfs entry %s=%s\n",
1462 term
->config
, term
->val
.str
);
1465 parse_events_error__handle(err
, term
->err_val
,
1466 strdup("expected numeric value"),
1472 if (pmu_resolve_param_term(term
, head_terms
, &val
))
1477 max_val
= pmu_format_max_value(format
->bits
);
1478 if (val
> max_val
) {
1482 if (asprintf(&err_str
,
1483 "value too big for format (%s), maximum is %llu",
1484 format
->name
, (unsigned long long)max_val
) < 0) {
1485 err_str
= strdup("value too big for format");
1487 parse_events_error__handle(err
, term
->err_val
, err_str
, /*help=*/NULL
);
1491 * Assume we don't care if !err, in which case the value will be
1492 * silently truncated.
1496 pmu_format_value(format
->bits
, val
, vp
, zero
);
1500 int perf_pmu__config_terms(const struct perf_pmu
*pmu
,
1501 struct perf_event_attr
*attr
,
1502 struct parse_events_terms
*terms
,
1503 bool zero
, bool apply_hardcoded
,
1504 struct parse_events_error
*err
)
1506 struct parse_events_term
*term
;
1508 if (perf_pmu__is_hwmon(pmu
))
1509 return hwmon_pmu__config_terms(pmu
, attr
, terms
, err
);
1511 list_for_each_entry(term
, &terms
->terms
, list
) {
1512 if (pmu_config_term(pmu
, attr
, term
, terms
, zero
, apply_hardcoded
, err
))
1520 * Configures event's 'attr' parameter based on the:
1521 * 1) users input - specified in terms parameter
1522 * 2) pmu format definitions - specified by pmu parameter
1524 int perf_pmu__config(struct perf_pmu
*pmu
, struct perf_event_attr
*attr
,
1525 struct parse_events_terms
*head_terms
,
1526 bool apply_hardcoded
,
1527 struct parse_events_error
*err
)
1529 bool zero
= !!pmu
->perf_event_attr_init_default
;
1531 /* Fake PMU doesn't have proper terms so nothing to configure in attr. */
1532 if (perf_pmu__is_fake(pmu
))
1535 return perf_pmu__config_terms(pmu
, attr
, head_terms
, zero
, apply_hardcoded
, err
);
1538 static struct perf_pmu_alias
*pmu_find_alias(struct perf_pmu
*pmu
,
1539 struct parse_events_term
*term
)
1541 struct perf_pmu_alias
*alias
;
1544 if (parse_events__is_hardcoded_term(term
))
1547 if (term
->type_val
== PARSE_EVENTS__TERM_TYPE_NUM
) {
1548 if (!term
->no_value
)
1550 if (pmu_find_format(&pmu
->format
, term
->config
))
1552 name
= term
->config
;
1554 } else if (term
->type_val
== PARSE_EVENTS__TERM_TYPE_STR
) {
1555 if (strcasecmp(term
->config
, "event"))
1557 name
= term
->val
.str
;
1562 alias
= perf_pmu__find_alias(pmu
, name
, /*load=*/ true);
1563 if (alias
|| pmu
->cpu_aliases_added
)
1566 /* Alias doesn't exist, try to get it from the json events. */
1567 if (pmu
->events_table
&&
1568 pmu_events_table__find_event(pmu
->events_table
, pmu
, name
,
1569 pmu_add_cpu_aliases_map_callback
,
1571 alias
= perf_pmu__find_alias(pmu
, name
, /*load=*/ false);
1577 static int check_info_data(struct perf_pmu
*pmu
,
1578 struct perf_pmu_alias
*alias
,
1579 struct perf_pmu_info
*info
,
1580 struct parse_events_error
*err
,
1583 read_alias_info(pmu
, alias
);
1585 * Only one term in event definition can
1586 * define unit, scale and snapshot, fail
1587 * if there's more than one.
1589 if (info
->unit
&& alias
->unit
[0]) {
1590 parse_events_error__handle(err
, column
,
1591 strdup("Attempt to set event's unit twice"),
1595 if (info
->scale
&& alias
->scale
) {
1596 parse_events_error__handle(err
, column
,
1597 strdup("Attempt to set event's scale twice"),
1601 if (info
->snapshot
&& alias
->snapshot
) {
1602 parse_events_error__handle(err
, column
,
1603 strdup("Attempt to set event snapshot twice"),
1609 info
->unit
= alias
->unit
;
1612 info
->scale
= alias
->scale
;
1614 if (alias
->snapshot
)
1615 info
->snapshot
= alias
->snapshot
;
1621 * Find alias in the terms list and replace it with the terms
1622 * defined for the alias
1624 int perf_pmu__check_alias(struct perf_pmu
*pmu
, struct parse_events_terms
*head_terms
,
1625 struct perf_pmu_info
*info
, bool *rewrote_terms
,
1626 u64
*alternate_hw_config
, struct parse_events_error
*err
)
1628 struct parse_events_term
*term
, *h
;
1629 struct perf_pmu_alias
*alias
;
1632 *rewrote_terms
= false;
1633 info
->per_pkg
= false;
1636 * Mark unit and scale as not set
1637 * (different from default values, see below)
1641 info
->snapshot
= false;
1643 if (perf_pmu__is_hwmon(pmu
)) {
1644 ret
= hwmon_pmu__check_alias(head_terms
, info
, err
);
1648 /* Fake PMU doesn't rewrite terms. */
1649 if (perf_pmu__is_fake(pmu
))
1652 list_for_each_entry_safe(term
, h
, &head_terms
->terms
, list
) {
1653 alias
= pmu_find_alias(pmu
, term
);
1656 ret
= pmu_alias_terms(alias
, term
->err_term
, &term
->list
);
1658 parse_events_error__handle(err
, term
->err_term
,
1659 strdup("Failure to duplicate terms"),
1664 *rewrote_terms
= true;
1665 ret
= check_info_data(pmu
, alias
, info
, err
, term
->err_term
);
1670 info
->per_pkg
= true;
1672 if (term
->alternate_hw_config
)
1673 *alternate_hw_config
= term
->val
.num
;
1675 list_del_init(&term
->list
);
1676 parse_events_term__delete(term
);
1680 * if no unit or scale found in aliases, then
1681 * set defaults as for evsel
1682 * unit cannot left to NULL
1684 if (info
->unit
== NULL
)
1687 if (info
->scale
== 0.0)
1693 struct find_event_args
{
1696 pmu_event_callback cb
;
1699 static int find_event_callback(void *state
, struct pmu_event_info
*info
)
1701 struct find_event_args
*args
= state
;
1703 if (!strcmp(args
->event
, info
->name
))
1704 return args
->cb(args
->state
, info
);
1709 int perf_pmu__find_event(struct perf_pmu
*pmu
, const char *event
, void *state
, pmu_event_callback cb
)
1711 struct find_event_args args
= {
1717 /* Sub-optimal, but function is only used by tests. */
1718 return perf_pmu__for_each_event(pmu
, /*skip_duplicate_pmus=*/ false,
1719 &args
, find_event_callback
);
1722 static void perf_pmu__del_formats(struct list_head
*formats
)
1724 struct perf_pmu_format
*fmt
, *tmp
;
1726 list_for_each_entry_safe(fmt
, tmp
, formats
, list
) {
1727 list_del(&fmt
->list
);
1733 bool perf_pmu__has_format(const struct perf_pmu
*pmu
, const char *name
)
1735 struct perf_pmu_format
*format
;
1737 list_for_each_entry(format
, &pmu
->format
, list
) {
1738 if (!strcmp(format
->name
, name
))
1744 int perf_pmu__for_each_format(struct perf_pmu
*pmu
, void *state
, pmu_format_callback cb
)
1746 static const char *const terms
[] = {
1747 "config=0..0xffffffffffffffff",
1748 "config1=0..0xffffffffffffffff",
1749 "config2=0..0xffffffffffffffff",
1750 "config3=0..0xffffffffffffffff",
1754 "branch_type=(u|k|hv|any|...)",
1756 "call-graph=(fp|dwarf|lbr)",
1757 "stack-size=number",
1766 "aux-sample-size=number",
1768 struct perf_pmu_format
*format
;
1772 * max-events and driver-config are missing above as are the internal
1773 * types user, metric-id, raw, legacy cache and hardware. Assert against
1774 * the enum parse_events__term_type so they are kept in sync.
1776 _Static_assert(ARRAY_SIZE(terms
) == __PARSE_EVENTS__TERM_TYPE_NR
- 6,
1777 "perf_pmu__for_each_format()'s terms must be kept in sync with enum parse_events__term_type");
1778 list_for_each_entry(format
, &pmu
->format
, list
) {
1779 perf_pmu_format__load(pmu
, format
);
1780 ret
= cb(state
, format
->name
, (int)format
->value
, format
->bits
);
1787 for (size_t i
= 0; i
< ARRAY_SIZE(terms
); i
++) {
1788 int config
= PERF_PMU_FORMAT_VALUE_CONFIG
;
1790 if (i
< PERF_PMU_FORMAT_VALUE_CONFIG_END
)
1793 ret
= cb(state
, terms
[i
], config
, /*bits=*/NULL
);
1800 bool is_pmu_core(const char *name
)
1802 return !strcmp(name
, "cpu") || !strcmp(name
, "cpum_cf") || is_sysfs_pmu_core(name
);
1805 bool perf_pmu__supports_legacy_cache(const struct perf_pmu
*pmu
)
1807 return pmu
->is_core
;
1810 bool perf_pmu__auto_merge_stats(const struct perf_pmu
*pmu
)
1812 return !pmu
->is_core
|| perf_pmus__num_core_pmus() == 1;
1815 bool perf_pmu__have_event(struct perf_pmu
*pmu
, const char *name
)
1819 if (perf_pmu__is_tool(pmu
) && tool_pmu__skip_event(name
))
1821 if (perf_pmu__is_hwmon(pmu
))
1822 return hwmon_pmu__have_event(pmu
, name
);
1823 if (perf_pmu__find_alias(pmu
, name
, /*load=*/ true) != NULL
)
1825 if (pmu
->cpu_aliases_added
|| !pmu
->events_table
)
1827 return pmu_events_table__find_event(pmu
->events_table
, pmu
, name
, NULL
, NULL
) == 0;
1830 size_t perf_pmu__num_events(struct perf_pmu
*pmu
)
1834 if (perf_pmu__is_hwmon(pmu
))
1835 return hwmon_pmu__num_events(pmu
);
1837 pmu_aliases_parse(pmu
);
1838 nr
= pmu
->sysfs_aliases
+ pmu
->sys_json_aliases
;
1840 if (pmu
->cpu_aliases_added
)
1841 nr
+= pmu
->cpu_json_aliases
;
1842 else if (pmu
->events_table
)
1843 nr
+= pmu_events_table__num_events(pmu
->events_table
, pmu
) - pmu
->cpu_json_aliases
;
1845 assert(pmu
->cpu_json_aliases
== 0);
1847 if (perf_pmu__is_tool(pmu
))
1848 nr
-= tool_pmu__num_skip_events();
1850 return pmu
->selectable
? nr
+ 1 : nr
;
1853 static int sub_non_neg(int a
, int b
)
1860 static char *format_alias(char *buf
, int len
, const struct perf_pmu
*pmu
,
1861 const struct perf_pmu_alias
*alias
, bool skip_duplicate_pmus
)
1863 struct parse_events_term
*term
;
1864 size_t pmu_name_len
= pmu_deduped_name_len(pmu
, pmu
->name
,
1865 skip_duplicate_pmus
);
1866 int used
= snprintf(buf
, len
, "%.*s/%s", (int)pmu_name_len
, pmu
->name
, alias
->name
);
1868 list_for_each_entry(term
, &alias
->terms
.terms
, list
) {
1869 if (term
->type_val
== PARSE_EVENTS__TERM_TYPE_STR
)
1870 used
+= snprintf(buf
+ used
, sub_non_neg(len
, used
),
1871 ",%s=%s", term
->config
,
1875 if (sub_non_neg(len
, used
) > 0) {
1879 if (sub_non_neg(len
, used
) > 0) {
1883 buf
[len
- 1] = '\0';
1888 int perf_pmu__for_each_event(struct perf_pmu
*pmu
, bool skip_duplicate_pmus
,
1889 void *state
, pmu_event_callback cb
)
1892 struct perf_pmu_alias
*event
;
1893 struct pmu_event_info info
= {
1895 .event_type_desc
= "Kernel PMU event",
1900 if (perf_pmu__is_hwmon(pmu
))
1901 return hwmon_pmu__for_each_event(pmu
, state
, cb
);
1903 strbuf_init(&sb
, /*hint=*/ 0);
1904 pmu_aliases_parse(pmu
);
1905 pmu_add_cpu_aliases(pmu
);
1906 list_for_each_entry(event
, &pmu
->aliases
, list
) {
1907 size_t buf_used
, pmu_name_len
;
1909 if (perf_pmu__is_tool(pmu
) && tool_pmu__skip_event(event
->name
))
1912 info
.pmu_name
= event
->pmu_name
?: pmu
->name
;
1913 pmu_name_len
= pmu_deduped_name_len(pmu
, info
.pmu_name
,
1914 skip_duplicate_pmus
);
1917 info
.name
= event
->name
;
1920 info
.name
= format_alias(buf
, sizeof(buf
), pmu
, event
,
1921 skip_duplicate_pmus
);
1923 info
.alias
= info
.name
;
1924 info
.name
= event
->name
;
1926 buf_used
= strlen(buf
) + 1;
1928 info
.scale_unit
= NULL
;
1929 if (strlen(event
->unit
) || event
->scale
!= 1.0) {
1930 info
.scale_unit
= buf
+ buf_used
;
1931 buf_used
+= snprintf(buf
+ buf_used
, sizeof(buf
) - buf_used
,
1932 "%G%s", event
->scale
, event
->unit
) + 1;
1934 info
.desc
= event
->desc
;
1935 info
.long_desc
= event
->long_desc
;
1936 info
.encoding_desc
= buf
+ buf_used
;
1937 parse_events_terms__to_strbuf(&event
->terms
, &sb
);
1938 buf_used
+= snprintf(buf
+ buf_used
, sizeof(buf
) - buf_used
,
1939 "%.*s/%s/", (int)pmu_name_len
, info
.pmu_name
, sb
.buf
) + 1;
1940 info
.topic
= event
->topic
;
1942 info
.deprecated
= event
->deprecated
;
1943 ret
= cb(state
, &info
);
1946 strbuf_setlen(&sb
, /*len=*/ 0);
1948 if (pmu
->selectable
) {
1950 snprintf(buf
, sizeof(buf
), "%s//", pmu
->name
);
1952 info
.scale_unit
= NULL
;
1954 info
.long_desc
= NULL
;
1955 info
.encoding_desc
= NULL
;
1957 info
.pmu_name
= pmu
->name
;
1958 info
.deprecated
= false;
1959 ret
= cb(state
, &info
);
1962 strbuf_release(&sb
);
1966 bool pmu__name_match(const struct perf_pmu
*pmu
, const char *pmu_name
)
1968 return !strcmp(pmu
->name
, pmu_name
) ||
1969 (pmu
->is_uncore
&& pmu_uncore_alias_match(pmu_name
, pmu
->name
)) ||
1971 * jevents and tests use default_core as a marker for any core
1972 * PMU as the PMU name varies across architectures.
1974 (pmu
->is_core
&& !strcmp(pmu_name
, "default_core"));
1977 bool perf_pmu__is_software(const struct perf_pmu
*pmu
)
1979 const char *known_sw_pmus
[] = {
1985 if (pmu
->is_core
|| pmu
->is_uncore
|| pmu
->auxtrace
)
1987 switch (pmu
->type
) {
1988 case PERF_TYPE_HARDWARE
: return false;
1989 case PERF_TYPE_SOFTWARE
: return true;
1990 case PERF_TYPE_TRACEPOINT
: return true;
1991 case PERF_TYPE_HW_CACHE
: return false;
1992 case PERF_TYPE_RAW
: return false;
1993 case PERF_TYPE_BREAKPOINT
: return true;
1994 case PERF_PMU_TYPE_TOOL
: return true;
1997 for (size_t i
= 0; i
< ARRAY_SIZE(known_sw_pmus
); i
++) {
1998 if (!strcmp(pmu
->name
, known_sw_pmus
[i
]))
2004 FILE *perf_pmu__open_file(const struct perf_pmu
*pmu
, const char *name
)
2006 char path
[PATH_MAX
];
2008 if (!perf_pmu__pathname_scnprintf(path
, sizeof(path
), pmu
->name
, name
) ||
2009 !file_available(path
))
2012 return fopen(path
, "r");
2015 FILE *perf_pmu__open_file_at(const struct perf_pmu
*pmu
, int dirfd
, const char *name
)
2019 fd
= perf_pmu__pathname_fd(dirfd
, pmu
->name
, name
, O_RDONLY
);
2023 return fdopen(fd
, "r");
2026 int perf_pmu__scan_file(const struct perf_pmu
*pmu
, const char *name
, const char *fmt
,
2033 va_start(args
, fmt
);
2034 file
= perf_pmu__open_file(pmu
, name
);
2036 ret
= vfscanf(file
, fmt
, args
);
2043 int perf_pmu__scan_file_at(const struct perf_pmu
*pmu
, int dirfd
, const char *name
,
2044 const char *fmt
, ...)
2050 va_start(args
, fmt
);
2051 file
= perf_pmu__open_file_at(pmu
, dirfd
, name
);
2053 ret
= vfscanf(file
, fmt
, args
);
2060 bool perf_pmu__file_exists(const struct perf_pmu
*pmu
, const char *name
)
2062 char path
[PATH_MAX
];
2064 if (!perf_pmu__pathname_scnprintf(path
, sizeof(path
), pmu
->name
, name
))
2067 return file_available(path
);
2070 static int perf_pmu__new_caps(struct list_head
*list
, char *name
, char *value
)
2072 struct perf_pmu_caps
*caps
= zalloc(sizeof(*caps
));
2077 caps
->name
= strdup(name
);
2080 caps
->value
= strndup(value
, strlen(value
) - 1);
2083 list_add_tail(&caps
->list
, list
);
2094 static void perf_pmu__del_caps(struct perf_pmu
*pmu
)
2096 struct perf_pmu_caps
*caps
, *tmp
;
2098 list_for_each_entry_safe(caps
, tmp
, &pmu
->caps
, list
) {
2099 list_del(&caps
->list
);
2101 zfree(&caps
->value
);
2107 * Reading/parsing the given pmu capabilities, which should be located at:
2108 * /sys/bus/event_source/devices/<dev>/caps as sysfs group attributes.
2109 * Return the number of capabilities
2111 int perf_pmu__caps_parse(struct perf_pmu
*pmu
)
2114 char caps_path
[PATH_MAX
];
2116 struct dirent
*evt_ent
;
2119 if (pmu
->caps_initialized
)
2120 return pmu
->nr_caps
;
2124 if (!perf_pmu__pathname_scnprintf(caps_path
, sizeof(caps_path
), pmu
->name
, "caps"))
2127 if (stat(caps_path
, &st
) < 0) {
2128 pmu
->caps_initialized
= true;
2129 return 0; /* no error if caps does not exist */
2132 caps_dir
= opendir(caps_path
);
2136 caps_fd
= dirfd(caps_dir
);
2138 while ((evt_ent
= readdir(caps_dir
)) != NULL
) {
2139 char *name
= evt_ent
->d_name
;
2144 if (!strcmp(name
, ".") || !strcmp(name
, ".."))
2147 fd
= openat(caps_fd
, name
, O_RDONLY
);
2150 file
= fdopen(fd
, "r");
2156 if (!fgets(value
, sizeof(value
), file
) ||
2157 (perf_pmu__new_caps(&pmu
->caps
, name
, value
) < 0)) {
2168 pmu
->caps_initialized
= true;
2169 return pmu
->nr_caps
;
2172 static void perf_pmu__compute_config_masks(struct perf_pmu
*pmu
)
2174 struct perf_pmu_format
*format
;
2176 if (pmu
->config_masks_computed
)
2179 list_for_each_entry(format
, &pmu
->format
, list
) {
2183 if (format
->value
>= PERF_PMU_FORMAT_VALUE_CONFIG_END
)
2186 pmu
->config_masks_present
= true;
2187 mask
= &pmu
->config_masks
[format
->value
];
2189 for_each_set_bit(i
, format
->bits
, PERF_PMU_FORMAT_BITS
)
2192 pmu
->config_masks_computed
= true;
2195 void perf_pmu__warn_invalid_config(struct perf_pmu
*pmu
, __u64 config
,
2196 const char *name
, int config_num
,
2197 const char *config_name
)
2202 perf_pmu__compute_config_masks(pmu
);
2205 * Kernel doesn't export any valid format bits.
2207 if (!pmu
->config_masks_present
)
2210 bits
= config
& ~pmu
->config_masks
[config_num
];
2214 bitmap_scnprintf((unsigned long *)&bits
, sizeof(bits
) * 8, buf
, sizeof(buf
));
2216 pr_warning("WARNING: event '%s' not valid (bits %s of %s "
2217 "'%llx' not supported by kernel)!\n",
2218 name
?: "N/A", buf
, config_name
, config
);
2221 bool perf_pmu__match(const struct perf_pmu
*pmu
, const char *tok
)
2223 const char *name
= pmu
->name
;
2224 bool need_fnmatch
= strisglob(tok
);
2226 if (!strncmp(tok
, "uncore_", 7))
2228 if (!strncmp(name
, "uncore_", 7))
2231 if (perf_pmu__match_ignoring_suffix(name
, tok
) ||
2232 (need_fnmatch
&& !fnmatch(tok
, name
, 0)))
2235 name
= pmu
->alias_name
;
2239 if (!strncmp(name
, "uncore_", 7))
2242 return perf_pmu__match_ignoring_suffix(name
, tok
) ||
2243 (need_fnmatch
&& !fnmatch(tok
, name
, 0));
2246 int perf_pmu__event_source_devices_scnprintf(char *pathname
, size_t size
)
2248 const char *sysfs
= sysfs__mountpoint();
2252 return scnprintf(pathname
, size
, "%s/bus/event_source/devices/", sysfs
);
2255 int perf_pmu__event_source_devices_fd(void)
2257 char path
[PATH_MAX
];
2258 const char *sysfs
= sysfs__mountpoint();
2263 scnprintf(path
, sizeof(path
), "%s/bus/event_source/devices/", sysfs
);
2264 return open(path
, O_DIRECTORY
);
2268 * Fill 'buf' with the path to a file or folder in 'pmu_name' in
2269 * sysfs. For example if pmu_name = "cs_etm" and 'filename' = "format"
2270 * then pathname will be filled with
2271 * "/sys/bus/event_source/devices/cs_etm/format"
2273 * Return 0 if the sysfs mountpoint couldn't be found, if no characters were
2274 * written or if the buffer size is exceeded.
2276 int perf_pmu__pathname_scnprintf(char *buf
, size_t size
,
2277 const char *pmu_name
, const char *filename
)
2281 len
= perf_pmu__event_source_devices_scnprintf(buf
, size
);
2282 if (!len
|| (len
+ strlen(pmu_name
) + strlen(filename
) + 1) >= size
)
2285 return scnprintf(buf
+ len
, size
- len
, "%s/%s", pmu_name
, filename
);
2288 int perf_pmu__pathname_fd(int dirfd
, const char *pmu_name
, const char *filename
, int flags
)
2290 char path
[PATH_MAX
];
2292 scnprintf(path
, sizeof(path
), "%s/%s", pmu_name
, filename
);
2293 return openat(dirfd
, path
, flags
);
2296 void perf_pmu__delete(struct perf_pmu
*pmu
)
2298 if (perf_pmu__is_hwmon(pmu
))
2299 hwmon_pmu__exit(pmu
);
2301 perf_pmu__del_formats(&pmu
->format
);
2302 perf_pmu__del_aliases(pmu
);
2303 perf_pmu__del_caps(pmu
);
2305 perf_cpu_map__put(pmu
->cpus
);
2308 zfree(&pmu
->alias_name
);
2313 const char *perf_pmu__name_from_config(struct perf_pmu
*pmu
, u64 config
)
2315 struct perf_pmu_alias
*event
;
2320 pmu_aliases_parse(pmu
);
2321 pmu_add_cpu_aliases(pmu
);
2322 list_for_each_entry(event
, &pmu
->aliases
, list
) {
2323 struct perf_event_attr attr
= {.config
= 0,};
2325 int ret
= perf_pmu__config(pmu
, &attr
, &event
->terms
, /*apply_hardcoded=*/true,
2328 if (ret
== 0 && config
== attr
.config
)