@@ -36,6 +36,18 @@ struct perf_pmu perf_pmu__fake = {
36
36
37
37
#define UNIT_MAX_LEN 31 /* max length for event unit name */
38
38
39
+ enum event_source {
40
+ /* An event loaded from /sys/devices/<pmu>/events. */
41
+ EVENT_SRC_SYSFS ,
42
+ /* An event loaded from a CPUID matched json file. */
43
+ EVENT_SRC_CPU_JSON ,
44
+ /*
45
+ * An event loaded from a /sys/devices/<pmu>/identifier matched json
46
+ * file.
47
+ */
48
+ EVENT_SRC_SYS_JSON ,
49
+ };
50
+
39
51
/**
40
52
* struct perf_pmu_alias - An event either read from sysfs or builtin in
41
53
* pmu-events.c, created by parsing the pmu-events json files.
@@ -521,7 +533,7 @@ static int update_alias(const struct pmu_event *pe,
521
533
522
534
static int perf_pmu__new_alias (struct perf_pmu * pmu , const char * name ,
523
535
const char * desc , const char * val , FILE * val_fd ,
524
- const struct pmu_event * pe )
536
+ const struct pmu_event * pe , enum event_source src )
525
537
{
526
538
struct perf_pmu_alias * alias ;
527
539
int ret ;
@@ -574,25 +586,30 @@ static int perf_pmu__new_alias(struct perf_pmu *pmu, const char *name,
574
586
}
575
587
snprintf (alias -> unit , sizeof (alias -> unit ), "%s" , unit );
576
588
}
577
- if (!pe ) {
578
- /* Update an event from sysfs with json data. */
579
- struct update_alias_data data = {
580
- .pmu = pmu ,
581
- .alias = alias ,
582
- };
583
-
589
+ switch (src ) {
590
+ default :
591
+ case EVENT_SRC_SYSFS :
584
592
alias -> from_sysfs = true;
585
593
if (pmu -> events_table ) {
594
+ /* Update an event from sysfs with json data. */
595
+ struct update_alias_data data = {
596
+ .pmu = pmu ,
597
+ .alias = alias ,
598
+ };
586
599
if (pmu_events_table__find_event (pmu -> events_table , pmu , name ,
587
600
update_alias , & data ) == 0 )
588
- pmu -> loaded_json_aliases ++ ;
601
+ pmu -> cpu_json_aliases ++ ;
589
602
}
590
- }
591
-
592
- if (!pe )
593
603
pmu -> sysfs_aliases ++ ;
594
- else
595
- pmu -> loaded_json_aliases ++ ;
604
+ break ;
605
+ case EVENT_SRC_CPU_JSON :
606
+ pmu -> cpu_json_aliases ++ ;
607
+ break ;
608
+ case EVENT_SRC_SYS_JSON :
609
+ pmu -> sys_json_aliases ++ ;
610
+ break ;
611
+
612
+ }
596
613
list_add_tail (& alias -> list , & pmu -> aliases );
597
614
return 0 ;
598
615
}
@@ -653,7 +670,8 @@ static int __pmu_aliases_parse(struct perf_pmu *pmu, int events_dir_fd)
653
670
}
654
671
655
672
if (perf_pmu__new_alias (pmu , name , /*desc=*/ NULL ,
656
- /*val=*/ NULL , file , /*pe=*/ NULL ) < 0 )
673
+ /*val=*/ NULL , file , /*pe=*/ NULL ,
674
+ EVENT_SRC_SYSFS ) < 0 )
657
675
pr_debug ("Cannot set up %s\n" , name );
658
676
fclose (file );
659
677
}
@@ -946,7 +964,8 @@ static int pmu_add_cpu_aliases_map_callback(const struct pmu_event *pe,
946
964
{
947
965
struct perf_pmu * pmu = vdata ;
948
966
949
- perf_pmu__new_alias (pmu , pe -> name , pe -> desc , pe -> event , /*val_fd=*/ NULL , pe );
967
+ perf_pmu__new_alias (pmu , pe -> name , pe -> desc , pe -> event , /*val_fd=*/ NULL ,
968
+ pe , EVENT_SRC_CPU_JSON );
950
969
return 0 ;
951
970
}
952
971
@@ -981,13 +1000,14 @@ static int pmu_add_sys_aliases_iter_fn(const struct pmu_event *pe,
981
1000
return 0 ;
982
1001
983
1002
if (pmu_uncore_alias_match (pe -> pmu , pmu -> name ) &&
984
- pmu_uncore_identifier_match (pe -> compat , pmu -> id )) {
1003
+ pmu_uncore_identifier_match (pe -> compat , pmu -> id )) {
985
1004
perf_pmu__new_alias (pmu ,
986
1005
pe -> name ,
987
1006
pe -> desc ,
988
1007
pe -> event ,
989
1008
/*val_fd=*/ NULL ,
990
- pe );
1009
+ pe ,
1010
+ EVENT_SRC_SYS_JSON );
991
1011
}
992
1012
993
1013
return 0 ;
@@ -1082,6 +1102,12 @@ struct perf_pmu *perf_pmu__lookup(struct list_head *pmus, int dirfd, const char
1082
1102
pmu -> max_precise = pmu_max_precise (dirfd , pmu );
1083
1103
pmu -> alias_name = pmu_find_alias_name (pmu , dirfd );
1084
1104
pmu -> events_table = perf_pmu__find_events_table (pmu );
1105
+ /*
1106
+ * Load the sys json events/aliases when loading the PMU as each event
1107
+ * may have a different compat regular expression. We therefore can't
1108
+ * know the number of sys json events/aliases without computing the
1109
+ * regular expressions for them all.
1110
+ */
1085
1111
pmu_add_sys_aliases (pmu );
1086
1112
list_add_tail (& pmu -> list , pmus );
1087
1113
@@ -1739,12 +1765,14 @@ size_t perf_pmu__num_events(struct perf_pmu *pmu)
1739
1765
size_t nr ;
1740
1766
1741
1767
pmu_aliases_parse (pmu );
1742
- nr = pmu -> sysfs_aliases ;
1768
+ nr = pmu -> sysfs_aliases + pmu -> sys_json_aliases ; ;
1743
1769
1744
1770
if (pmu -> cpu_aliases_added )
1745
- nr += pmu -> loaded_json_aliases ;
1771
+ nr += pmu -> cpu_json_aliases ;
1746
1772
else if (pmu -> events_table )
1747
- nr += pmu_events_table__num_events (pmu -> events_table , pmu ) - pmu -> loaded_json_aliases ;
1773
+ nr += pmu_events_table__num_events (pmu -> events_table , pmu ) - pmu -> cpu_json_aliases ;
1774
+ else
1775
+ assert (pmu -> cpu_json_aliases == 0 );
1748
1776
1749
1777
return pmu -> selectable ? nr + 1 : nr ;
1750
1778
}
0 commit comments