@@ -523,8 +523,9 @@ static int perf_pmu__new_alias(struct perf_pmu *pmu, int dirfd, const char *name
523523 if (!pe ) {
524524 /* Update an event from sysfs with json data. */
525525 if (pmu -> events_table ) {
526- pmu_events_table__find_event (pmu -> events_table , pmu , name ,
527- update_alias , alias );
526+ if (pmu_events_table__find_event (pmu -> events_table , pmu , name ,
527+ update_alias , alias ) == 0 )
528+ pmu -> loaded_json_aliases ++ ;
528529 }
529530 }
530531
@@ -548,6 +549,10 @@ static int perf_pmu__new_alias(struct perf_pmu *pmu, int dirfd, const char *name
548549 "%s=%s" , term -> config , term -> val .str );
549550 }
550551 alias -> str = strdup (newval );
552+ if (!pe )
553+ pmu -> sysfs_aliases ++ ;
554+ else
555+ pmu -> loaded_json_aliases ++ ;
551556 list_add_tail (& alias -> list , & pmu -> aliases );
552557 return 0 ;
553558}
@@ -878,7 +883,11 @@ static void pmu_add_cpu_aliases(struct perf_pmu *pmu)
878883 if (!pmu -> events_table )
879884 return ;
880885
886+ if (pmu -> cpu_aliases_added )
887+ return ;
888+
881889 pmu_add_cpu_aliases_table (pmu , pmu -> events_table );
890+ pmu -> cpu_aliases_added = true;
882891}
883892
884893static int pmu_add_sys_aliases_iter_fn (const struct pmu_event * pe ,
@@ -990,7 +999,6 @@ struct perf_pmu *perf_pmu__lookup(struct list_head *pmus, int dirfd, const char
990999 pmu -> id = pmu_id (name );
9911000 pmu -> max_precise = pmu_max_precise (dirfd , pmu );
9921001 pmu -> events_table = perf_pmu__find_events_table (pmu );
993- pmu_add_cpu_aliases (pmu );
9941002 pmu_add_sys_aliases (pmu );
9951003 list_add_tail (& pmu -> list , pmus );
9961004
@@ -1368,6 +1376,7 @@ int perf_pmu__config(struct perf_pmu *pmu, struct perf_event_attr *attr,
13681376static struct perf_pmu_alias * pmu_find_alias (struct perf_pmu * pmu ,
13691377 struct parse_events_term * term )
13701378{
1379+ struct perf_pmu_alias * alias ;
13711380 char * name ;
13721381
13731382 if (parse_events__is_hardcoded_term (term ))
@@ -1388,7 +1397,18 @@ static struct perf_pmu_alias *pmu_find_alias(struct perf_pmu *pmu,
13881397 return NULL ;
13891398 }
13901399
1391- return perf_pmu__find_alias (pmu , name );
1400+ alias = perf_pmu__find_alias (pmu , name );
1401+ if (alias || pmu -> cpu_aliases_added )
1402+ return alias ;
1403+
1404+ /* Alias doesn't exist, try to get it from the json events. */
1405+ if (pmu -> events_table &&
1406+ pmu_events_table__find_event (pmu -> events_table , pmu , name ,
1407+ pmu_add_cpu_aliases_map_callback ,
1408+ pmu ) == 0 ) {
1409+ alias = perf_pmu__find_alias (pmu , name );
1410+ }
1411+ return alias ;
13921412}
13931413
13941414
@@ -1555,18 +1575,23 @@ bool perf_pmu__auto_merge_stats(const struct perf_pmu *pmu)
15551575 return !pmu -> is_core || perf_pmus__num_core_pmus () == 1 ;
15561576}
15571577
1558- bool perf_pmu__have_event (const struct perf_pmu * pmu , const char * name )
1578+ bool perf_pmu__have_event (struct perf_pmu * pmu , const char * name )
15591579{
1560- return perf_pmu__find_alias (pmu , name ) != NULL ;
1580+ if (perf_pmu__find_alias (pmu , name ) != NULL )
1581+ return true;
1582+ if (pmu -> cpu_aliases_added || !pmu -> events_table )
1583+ return false;
1584+ return pmu_events_table__find_event (pmu -> events_table , pmu , name , NULL , NULL ) == 0 ;
15611585}
15621586
1563- size_t perf_pmu__num_events (const struct perf_pmu * pmu )
1587+ size_t perf_pmu__num_events (struct perf_pmu * pmu )
15641588{
1565- struct list_head * list ;
1566- size_t nr = 0 ;
1589+ size_t nr = pmu -> sysfs_aliases ;
15671590
1568- list_for_each (list , & pmu -> aliases )
1569- nr ++ ;
1591+ if (pmu -> cpu_aliases_added )
1592+ nr += pmu -> loaded_json_aliases ;
1593+ else if (pmu -> events_table )
1594+ nr += pmu_events_table__num_events (pmu -> events_table , pmu ) - pmu -> loaded_json_aliases ;
15701595
15711596 return pmu -> selectable ? nr + 1 : nr ;
15721597}
@@ -1604,7 +1629,7 @@ static char *format_alias(char *buf, int len, const struct perf_pmu *pmu,
16041629 return buf ;
16051630}
16061631
1607- int perf_pmu__for_each_event (const struct perf_pmu * pmu , void * state , pmu_event_callback cb )
1632+ int perf_pmu__for_each_event (struct perf_pmu * pmu , void * state , pmu_event_callback cb )
16081633{
16091634 char buf [1024 ];
16101635 struct perf_pmu_alias * event ;
@@ -1613,6 +1638,7 @@ int perf_pmu__for_each_event(const struct perf_pmu *pmu, void *state, pmu_event_
16131638 };
16141639 int ret = 0 ;
16151640
1641+ pmu_add_cpu_aliases (pmu );
16161642 list_for_each_entry (event , & pmu -> aliases , list ) {
16171643 size_t buf_used ;
16181644
0 commit comments