1 #include <linux/list.h>
12 #include "parse-events.h"
15 struct perf_pmu_format
{
18 DECLARE_BITMAP(bits
, PERF_PMU_FORMAT_BITS
);
19 struct list_head list
;
22 #define EVENT_SOURCE_DEVICE_PATH "/bus/event_source/devices/"
24 int perf_pmu_parse(struct list_head
*list
, char *name
);
25 extern FILE *perf_pmu_in
;
27 static LIST_HEAD(pmus
);
30 * Parse & process all the sysfs attributes located under
31 * the directory specified in 'dir' parameter.
33 int perf_pmu__format_parse(char *dir
, struct list_head
*head
)
35 struct dirent
*evt_ent
;
39 format_dir
= opendir(dir
);
43 while (!ret
&& (evt_ent
= readdir(format_dir
))) {
45 char *name
= evt_ent
->d_name
;
48 if (!strcmp(name
, ".") || !strcmp(name
, ".."))
51 snprintf(path
, PATH_MAX
, "%s/%s", dir
, name
);
54 file
= fopen(path
, "r");
59 ret
= perf_pmu_parse(head
, name
);
68 * Reading/parsing the default pmu format definition, which should be
70 * /sys/bus/event_source/devices/<dev>/format as sysfs group attributes.
72 static int pmu_format(const char *name
, struct list_head
*format
)
76 const char *sysfs
= sysfs__mountpoint();
81 snprintf(path
, PATH_MAX
,
82 "%s" EVENT_SOURCE_DEVICE_PATH
"%s/format", sysfs
, name
);
84 if (stat(path
, &st
) < 0)
85 return 0; /* no error if format does not exist */
87 if (perf_pmu__format_parse(path
, format
))
93 static int perf_pmu__parse_scale(struct perf_pmu_alias
*alias
, char *dir
, char *name
)
102 snprintf(path
, PATH_MAX
, "%s/%s.scale", dir
, name
);
104 fd
= open(path
, O_RDONLY
);
108 if (fstat(fd
, &st
) < 0)
111 sret
= read(fd
, scale
, sizeof(scale
)-1);
117 * save current locale
119 lc
= setlocale(LC_NUMERIC
, NULL
);
122 * force to C locale to ensure kernel
123 * scale string is converted correctly.
124 * kernel uses default C locale.
126 setlocale(LC_NUMERIC
, "C");
128 alias
->scale
= strtod(scale
, NULL
);
131 setlocale(LC_NUMERIC
, lc
);
139 static int perf_pmu__parse_unit(struct perf_pmu_alias
*alias
, char *dir
, char *name
)
145 snprintf(path
, PATH_MAX
, "%s/%s.unit", dir
, name
);
147 fd
= open(path
, O_RDONLY
);
151 sret
= read(fd
, alias
->unit
, UNIT_MAX_LEN
);
157 alias
->unit
[sret
] = '\0';
162 alias
->unit
[0] = '\0';
167 perf_pmu__parse_per_pkg(struct perf_pmu_alias
*alias
, char *dir
, char *name
)
172 snprintf(path
, PATH_MAX
, "%s/%s.per-pkg", dir
, name
);
174 fd
= open(path
, O_RDONLY
);
180 alias
->per_pkg
= true;
184 static int perf_pmu__parse_snapshot(struct perf_pmu_alias
*alias
,
185 char *dir
, char *name
)
190 snprintf(path
, PATH_MAX
, "%s/%s.snapshot", dir
, name
);
192 fd
= open(path
, O_RDONLY
);
196 alias
->snapshot
= true;
201 static int perf_pmu__new_alias(struct list_head
*list
, char *dir
, char *name
, FILE *file
)
203 struct perf_pmu_alias
*alias
;
207 ret
= fread(buf
, 1, sizeof(buf
), file
);
212 alias
= malloc(sizeof(*alias
));
216 INIT_LIST_HEAD(&alias
->terms
);
218 alias
->unit
[0] = '\0';
219 alias
->per_pkg
= false;
221 ret
= parse_events_terms(&alias
->terms
, buf
);
227 alias
->name
= strdup(name
);
229 * load unit name and scale if available
231 perf_pmu__parse_unit(alias
, dir
, name
);
232 perf_pmu__parse_scale(alias
, dir
, name
);
233 perf_pmu__parse_per_pkg(alias
, dir
, name
);
234 perf_pmu__parse_snapshot(alias
, dir
, name
);
236 list_add_tail(&alias
->list
, list
);
241 static inline bool pmu_alias_info_file(char *name
)
246 if (len
> 5 && !strcmp(name
+ len
- 5, ".unit"))
248 if (len
> 6 && !strcmp(name
+ len
- 6, ".scale"))
250 if (len
> 8 && !strcmp(name
+ len
- 8, ".per-pkg"))
252 if (len
> 9 && !strcmp(name
+ len
- 9, ".snapshot"))
259 * Process all the sysfs attributes located under the directory
260 * specified in 'dir' parameter.
262 static int pmu_aliases_parse(char *dir
, struct list_head
*head
)
264 struct dirent
*evt_ent
;
268 event_dir
= opendir(dir
);
272 while (!ret
&& (evt_ent
= readdir(event_dir
))) {
274 char *name
= evt_ent
->d_name
;
277 if (!strcmp(name
, ".") || !strcmp(name
, ".."))
281 * skip info files parsed in perf_pmu__new_alias()
283 if (pmu_alias_info_file(name
))
286 snprintf(path
, PATH_MAX
, "%s/%s", dir
, name
);
289 file
= fopen(path
, "r");
293 ret
= perf_pmu__new_alias(head
, dir
, name
, file
);
302 * Reading the pmu event aliases definition, which should be located at:
303 * /sys/bus/event_source/devices/<dev>/events as sysfs group attributes.
305 static int pmu_aliases(const char *name
, struct list_head
*head
)
309 const char *sysfs
= sysfs__mountpoint();
314 snprintf(path
, PATH_MAX
,
315 "%s/bus/event_source/devices/%s/events", sysfs
, name
);
317 if (stat(path
, &st
) < 0)
318 return 0; /* no error if 'events' does not exist */
320 if (pmu_aliases_parse(path
, head
))
326 static int pmu_alias_terms(struct perf_pmu_alias
*alias
,
327 struct list_head
*terms
)
329 struct parse_events_term
*term
, *cloned
;
333 list_for_each_entry(term
, &alias
->terms
, list
) {
334 ret
= parse_events_term__clone(&cloned
, term
);
336 parse_events__free_terms(&list
);
339 list_add_tail(&cloned
->list
, &list
);
341 list_splice(&list
, terms
);
346 * Reading/parsing the default pmu type value, which should be
348 * /sys/bus/event_source/devices/<dev>/type as sysfs attribute.
350 static int pmu_type(const char *name
, __u32
*type
)
356 const char *sysfs
= sysfs__mountpoint();
361 snprintf(path
, PATH_MAX
,
362 "%s" EVENT_SOURCE_DEVICE_PATH
"%s/type", sysfs
, name
);
364 if (stat(path
, &st
) < 0)
367 file
= fopen(path
, "r");
371 if (1 != fscanf(file
, "%u", type
))
378 /* Add all pmus in sysfs to pmu list: */
379 static void pmu_read_sysfs(void)
384 const char *sysfs
= sysfs__mountpoint();
389 snprintf(path
, PATH_MAX
,
390 "%s" EVENT_SOURCE_DEVICE_PATH
, sysfs
);
396 while ((dent
= readdir(dir
))) {
397 if (!strcmp(dent
->d_name
, ".") || !strcmp(dent
->d_name
, ".."))
399 /* add to static LIST_HEAD(pmus): */
400 perf_pmu__find(dent
->d_name
);
406 static struct cpu_map
*pmu_cpumask(const char *name
)
411 struct cpu_map
*cpus
;
412 const char *sysfs
= sysfs__mountpoint();
417 snprintf(path
, PATH_MAX
,
418 "%s/bus/event_source/devices/%s/cpumask", sysfs
, name
);
420 if (stat(path
, &st
) < 0)
423 file
= fopen(path
, "r");
427 cpus
= cpu_map__read(file
);
432 struct perf_event_attr
*__attribute__((weak
))
433 perf_pmu__get_default_config(struct perf_pmu
*pmu __maybe_unused
)
438 static struct perf_pmu
*pmu_lookup(const char *name
)
440 struct perf_pmu
*pmu
;
446 * The pmu data we store & need consists of the pmu
447 * type value and format definitions. Load both right
450 if (pmu_format(name
, &format
))
453 if (pmu_aliases(name
, &aliases
))
456 if (pmu_type(name
, &type
))
459 pmu
= zalloc(sizeof(*pmu
));
463 pmu
->cpus
= pmu_cpumask(name
);
465 INIT_LIST_HEAD(&pmu
->format
);
466 INIT_LIST_HEAD(&pmu
->aliases
);
467 list_splice(&format
, &pmu
->format
);
468 list_splice(&aliases
, &pmu
->aliases
);
469 pmu
->name
= strdup(name
);
471 list_add_tail(&pmu
->list
, &pmus
);
473 pmu
->default_config
= perf_pmu__get_default_config(pmu
);
478 static struct perf_pmu
*pmu_find(const char *name
)
480 struct perf_pmu
*pmu
;
482 list_for_each_entry(pmu
, &pmus
, list
)
483 if (!strcmp(pmu
->name
, name
))
489 struct perf_pmu
*perf_pmu__scan(struct perf_pmu
*pmu
)
492 * pmu iterator: If pmu is NULL, we start at the begin,
493 * otherwise return the next pmu. Returns NULL on end.
497 pmu
= list_prepare_entry(pmu
, &pmus
, list
);
499 list_for_each_entry_continue(pmu
, &pmus
, list
)
504 struct perf_pmu
*perf_pmu__find(const char *name
)
506 struct perf_pmu
*pmu
;
509 * Once PMU is loaded it stays in the list,
510 * so we keep us from multiple reading/parsing
511 * the pmu format definitions.
513 pmu
= pmu_find(name
);
517 return pmu_lookup(name
);
520 static struct perf_pmu_format
*
521 pmu_find_format(struct list_head
*formats
, char *name
)
523 struct perf_pmu_format
*format
;
525 list_for_each_entry(format
, formats
, list
)
526 if (!strcmp(format
->name
, name
))
533 * Sets value based on the format definition (format parameter)
534 * and unformated value (value parameter).
536 static void pmu_format_value(unsigned long *format
, __u64 value
, __u64
*v
,
539 unsigned long fbit
, vbit
;
541 for (fbit
= 0, vbit
= 0; fbit
< PERF_PMU_FORMAT_BITS
; fbit
++) {
543 if (!test_bit(fbit
, format
))
546 if (value
& (1llu << vbit
++))
547 *v
|= (1llu << fbit
);
549 *v
&= ~(1llu << fbit
);
554 * Setup one of config[12] attr members based on the
555 * user input data - term parameter.
557 static int pmu_config_term(struct list_head
*formats
,
558 struct perf_event_attr
*attr
,
559 struct parse_events_term
*term
,
562 struct perf_pmu_format
*format
;
566 * Support only for hardcoded and numnerial terms.
567 * Hardcoded terms should be already in, so nothing
568 * to be done for them.
570 if (parse_events__is_hardcoded_term(term
))
573 if (term
->type_val
!= PARSE_EVENTS__TERM_TYPE_NUM
)
576 format
= pmu_find_format(formats
, term
->config
);
580 switch (format
->value
) {
581 case PERF_PMU_FORMAT_VALUE_CONFIG
:
584 case PERF_PMU_FORMAT_VALUE_CONFIG1
:
587 case PERF_PMU_FORMAT_VALUE_CONFIG2
:
595 * XXX If we ever decide to go with string values for
596 * non-hardcoded terms, here's the place to translate
599 pmu_format_value(format
->bits
, term
->val
.num
, vp
, zero
);
603 int perf_pmu__config_terms(struct list_head
*formats
,
604 struct perf_event_attr
*attr
,
605 struct list_head
*head_terms
,
608 struct parse_events_term
*term
;
610 list_for_each_entry(term
, head_terms
, list
)
611 if (pmu_config_term(formats
, attr
, term
, zero
))
618 * Configures event's 'attr' parameter based on the:
619 * 1) users input - specified in terms parameter
620 * 2) pmu format definitions - specified by pmu parameter
622 int perf_pmu__config(struct perf_pmu
*pmu
, struct perf_event_attr
*attr
,
623 struct list_head
*head_terms
)
625 bool zero
= !!pmu
->default_config
;
627 attr
->type
= pmu
->type
;
628 return perf_pmu__config_terms(&pmu
->format
, attr
, head_terms
, zero
);
631 static struct perf_pmu_alias
*pmu_find_alias(struct perf_pmu
*pmu
,
632 struct parse_events_term
*term
)
634 struct perf_pmu_alias
*alias
;
637 if (parse_events__is_hardcoded_term(term
))
640 if (term
->type_val
== PARSE_EVENTS__TERM_TYPE_NUM
) {
641 if (term
->val
.num
!= 1)
643 if (pmu_find_format(&pmu
->format
, term
->config
))
646 } else if (term
->type_val
== PARSE_EVENTS__TERM_TYPE_STR
) {
647 if (strcasecmp(term
->config
, "event"))
649 name
= term
->val
.str
;
654 list_for_each_entry(alias
, &pmu
->aliases
, list
) {
655 if (!strcasecmp(alias
->name
, name
))
662 static int check_info_data(struct perf_pmu_alias
*alias
,
663 struct perf_pmu_info
*info
)
666 * Only one term in event definition can
667 * define unit, scale and snapshot, fail
668 * if there's more than one.
670 if ((info
->unit
&& alias
->unit
) ||
671 (info
->scale
&& alias
->scale
) ||
672 (info
->snapshot
&& alias
->snapshot
))
676 info
->unit
= alias
->unit
;
679 info
->scale
= alias
->scale
;
682 info
->snapshot
= alias
->snapshot
;
688 * Find alias in the terms list and replace it with the terms
689 * defined for the alias
691 int perf_pmu__check_alias(struct perf_pmu
*pmu
, struct list_head
*head_terms
,
692 struct perf_pmu_info
*info
)
694 struct parse_events_term
*term
, *h
;
695 struct perf_pmu_alias
*alias
;
698 info
->per_pkg
= false;
701 * Mark unit and scale as not set
702 * (different from default values, see below)
706 info
->snapshot
= false;
708 list_for_each_entry_safe(term
, h
, head_terms
, list
) {
709 alias
= pmu_find_alias(pmu
, term
);
712 ret
= pmu_alias_terms(alias
, &term
->list
);
716 ret
= check_info_data(alias
, info
);
721 info
->per_pkg
= true;
723 list_del(&term
->list
);
728 * if no unit or scale foundin aliases, then
729 * set defaults as for evsel
730 * unit cannot left to NULL
732 if (info
->unit
== NULL
)
735 if (info
->scale
== 0.0)
741 int perf_pmu__new_format(struct list_head
*list
, char *name
,
742 int config
, unsigned long *bits
)
744 struct perf_pmu_format
*format
;
746 format
= zalloc(sizeof(*format
));
750 format
->name
= strdup(name
);
751 format
->value
= config
;
752 memcpy(format
->bits
, bits
, sizeof(format
->bits
));
754 list_add_tail(&format
->list
, list
);
758 void perf_pmu__set_format(unsigned long *bits
, long from
, long to
)
765 memset(bits
, 0, BITS_TO_BYTES(PERF_PMU_FORMAT_BITS
));
766 for (b
= from
; b
<= to
; b
++)
770 static char *format_alias(char *buf
, int len
, struct perf_pmu
*pmu
,
771 struct perf_pmu_alias
*alias
)
773 snprintf(buf
, len
, "%s/%s/", pmu
->name
, alias
->name
);
777 static char *format_alias_or(char *buf
, int len
, struct perf_pmu
*pmu
,
778 struct perf_pmu_alias
*alias
)
780 snprintf(buf
, len
, "%s OR %s/%s/", alias
->name
, pmu
->name
, alias
->name
);
784 static int cmp_string(const void *a
, const void *b
)
786 const char * const *as
= a
;
787 const char * const *bs
= b
;
788 return strcmp(*as
, *bs
);
791 void print_pmu_events(const char *event_glob
, bool name_only
)
793 struct perf_pmu
*pmu
;
794 struct perf_pmu_alias
*alias
;
802 while ((pmu
= perf_pmu__scan(pmu
)) != NULL
) {
803 list_for_each_entry(alias
, &pmu
->aliases
, list
)
808 aliases
= zalloc(sizeof(char *) * len
);
813 while ((pmu
= perf_pmu__scan(pmu
)) != NULL
) {
814 list_for_each_entry(alias
, &pmu
->aliases
, list
) {
815 char *name
= format_alias(buf
, sizeof(buf
), pmu
, alias
);
816 bool is_cpu
= !strcmp(pmu
->name
, "cpu");
818 if (event_glob
!= NULL
&&
819 !(strglobmatch(name
, event_glob
) ||
820 (!is_cpu
&& strglobmatch(alias
->name
,
824 if (is_cpu
&& !name_only
)
825 name
= format_alias_or(buf
, sizeof(buf
), pmu
, alias
);
827 aliases
[j
] = strdup(name
);
828 if (aliases
[j
] == NULL
)
832 if (pmu
->selectable
) {
834 if (asprintf(&s
, "%s//", pmu
->name
) < 0)
841 qsort(aliases
, len
, sizeof(char *), cmp_string
);
842 for (j
= 0; j
< len
; j
++) {
844 printf("%s ", aliases
[j
]);
847 printf(" %-50s [Kernel PMU event]\n", aliases
[j
]);
853 for (j
= 0; j
< len
; j
++)
859 printf("FATAL: not enough memory to print PMU events\n");
864 bool pmu_have_event(const char *pname
, const char *name
)
866 struct perf_pmu
*pmu
;
867 struct perf_pmu_alias
*alias
;
870 while ((pmu
= perf_pmu__scan(pmu
)) != NULL
) {
871 if (strcmp(pname
, pmu
->name
))
873 list_for_each_entry(alias
, &pmu
->aliases
, list
)
874 if (!strcmp(alias
->name
, name
))
880 static FILE *perf_pmu__open_file(struct perf_pmu
*pmu
, const char *name
)
886 sysfs
= sysfs__mountpoint();
890 snprintf(path
, PATH_MAX
,
891 "%s" EVENT_SOURCE_DEVICE_PATH
"%s/%s", sysfs
, pmu
->name
, name
);
893 if (stat(path
, &st
) < 0)
896 return fopen(path
, "r");
899 int perf_pmu__scan_file(struct perf_pmu
*pmu
, const char *name
, const char *fmt
,
907 file
= perf_pmu__open_file(pmu
, name
);
909 ret
= vfscanf(file
, fmt
, args
);