perf pmu: Add helper function is_pmu_core to detect PMU CORE devices
tip-bot for Ganapatrao Kulkarni
merge botCommit-ID: 14b22ae028de56cca980171db625d1e9925c8fba Gitweb: https://git.kernel.org/tip/14b22ae028de56cca980171db625d1e9925c8fba Author: Ganapatrao Kulkarni <[email protected]> AuthorDate: Thu, 24 Aug 2017 16:30:58 +0530 Committer: Arnaldo Carvalho de Melo <[email protected]> CommitDate: Tue, 5 Dec 2017 15:43:51 -0300
perf pmu: Add helper function is_pmu_core to detect PMU CORE devices
On some platforms, PMU core devices sysfs name is not cpu. Adding function is_pmu_core to detect PMU core devices using core device specific hints in sysfs.
For arm64 platforms, all core devices have file "cpus" in sysfs.
Signed-off-by Ganapatrao Kulkarni <[email protected]>
Tested-by Shaokun Zhang <[email protected]>
Tested-by Jin Yao <[email protected]>
Acked-by Will Deacon <[email protected]>
Signed-off-by Arnaldo Carvalho de Melo <[email protected]>
--- tools/perf/util/pmu.c | 39 +++++++++++++++++++++++++++++++++++---- 1 file changed, 35 insertions(+), 4 deletions(-)
tools/perf/util/pmu.c +35 -4
@@ -537,6 +537,34 @@ static bool pmu_is_uncore(const char *name) }/* +* PMU CORE devices have different name other than cpu in sysfs on some +* platforms. looking for possible sysfs files to identify as core device. +*/ +static int is_pmu_core (const char *name) +{ +struct stat st; +char path[PATH_MAX ]; +const char *sysfs =sysfs__mountpoint (); + +if (!sysfs) +return 0 ; + +/* Look for cpu sysfs (x86 and others) */ +scnprintf (path,PATH_MAX ,"%s/bus/event_source/devices/cpu" , sysfs); +if ((stat (path, &st) ==0 ) && + (strncmp (name,"cpu" ,strlen ("cpu" )) ==0 )) +return 1 ; + +/* Look for cpu sysfs (specific to arm) */ +scnprintf (path,PATH_MAX ,"%s/bus/event_source/devices/%s/cpus" , + sysfs, name); +if (stat (path, &st) ==0 ) +return 1 ; + +return 0 ; +} + +/* * Return the CPU id as a raw string. * * Each architecture should provide a more precise id string that
@@ -609,7 +637,6 @@ static void pmu_add_cpu_aliases(struct list_head *head, struct perf_pmu *pmu)*/ i =0 ;while (1 ) { -const char *pname; pe = &map->table[i++];if (!pe->name) {
@@ -618,9 +645,13 @@ static void pmu_add_cpu_aliases(struct list_head *head, struct perf_pmu *pmu)break ; } - pname = pe->pmu ? pe->pmu :"cpu" ; -if (strncmp (pname, name,strlen (pname))) -continue ; +if (!is_pmu_core (name)) { +/* check for uncore devices */ +if (pe->pmu ==NULL ) +continue ; +if (strncmp (pe->pmu, name,strlen (pe->pmu))) +continue ; + }/* need type casts to override 'const' */ __perf_pmu__new_alias(head, NULL, (char *)pe->name,