mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 02:30:34 +02:00 
			
		
		
		
	perf pmu: Fix core PMU alias list for X86 platform
When counting uncore event with alias, core event is mistakenly
involved, for example:
  perf stat --no-merge -e "unc_m_cas_count.all" -C0  sleep 1
  Performance counter stats for 'CPU(s) 0':
                 0      unc_m_cas_count.all [uncore_imc_4]
                 0      unc_m_cas_count.all [uncore_imc_2]
                 0      unc_m_cas_count.all [uncore_imc_0]
           153,640      unc_m_cas_count.all [cpu]
                 0      unc_m_cas_count.all [uncore_imc_5]
            25,026      unc_m_cas_count.all [uncore_imc_3]
                 0      unc_m_cas_count.all [uncore_imc_1]
       1.001447890 seconds time elapsed
The reason is that current implementation doesn't check PMU name of a
event when adding its alias into the alias list for core PMU. The
uncore event aliases are mistakenly added.
This bug was introduced in:
  commit 14b22ae028 ("perf pmu: Add helper function is_pmu_core to
  detect PMU CORE devices")
Checking the PMU name for all PMUs on X86 and other architectures except
ARM.
There is no behavior change for ARM.
Signed-off-by: Kan Liang <kan.liang@linux.intel.com>
Tested-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: Agustin Vega-Frias <agustinv@codeaurora.org>
Cc: Andi Kleen <ak@linux.intel.com>
Cc: Ganapatrao Kulkarni <ganapatrao.kulkarni@cavium.com>
Cc: Jin Yao <yao.jin@linux.intel.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Shaokun Zhang <zhangshaokun@hisilicon.com>
Cc: Will Deacon <will.deacon@arm.com>
Fixes: 14b22ae028 ("perf pmu: Add helper function is_pmu_core to detect PMU CORE devices")
Link: http://lkml.kernel.org/r/1524594014-79243-1-git-send-email-kan.liang@linux.intel.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
			
			
This commit is contained in:
		
							parent
							
								
									5d9946c3e5
								
							
						
					
					
						commit
						292c34c102
					
				
					 1 changed files with 7 additions and 13 deletions
				
			
		| 
						 | 
					@ -539,9 +539,10 @@ static bool pmu_is_uncore(const char *name)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
 *  PMU CORE devices have different name other than cpu in sysfs on some
 | 
					 *  PMU CORE devices have different name other than cpu in sysfs on some
 | 
				
			||||||
 *  platforms. looking for possible sysfs files to identify as core device.
 | 
					 *  platforms.
 | 
				
			||||||
 | 
					 *  Looking for possible sysfs files to identify the arm core device.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
static int is_pmu_core(const char *name)
 | 
					static int is_arm_pmu_core(const char *name)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct stat st;
 | 
						struct stat st;
 | 
				
			||||||
	char path[PATH_MAX];
 | 
						char path[PATH_MAX];
 | 
				
			||||||
| 
						 | 
					@ -550,12 +551,6 @@ static int is_pmu_core(const char *name)
 | 
				
			||||||
	if (!sysfs)
 | 
						if (!sysfs)
 | 
				
			||||||
		return 0;
 | 
							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) */
 | 
						/* Look for cpu sysfs (specific to arm) */
 | 
				
			||||||
	scnprintf(path, PATH_MAX, "%s/bus/event_source/devices/%s/cpus",
 | 
						scnprintf(path, PATH_MAX, "%s/bus/event_source/devices/%s/cpus",
 | 
				
			||||||
				sysfs, name);
 | 
									sysfs, name);
 | 
				
			||||||
| 
						 | 
					@ -668,6 +663,7 @@ static void pmu_add_cpu_aliases(struct list_head *head, struct perf_pmu *pmu)
 | 
				
			||||||
	struct pmu_events_map *map;
 | 
						struct pmu_events_map *map;
 | 
				
			||||||
	struct pmu_event *pe;
 | 
						struct pmu_event *pe;
 | 
				
			||||||
	const char *name = pmu->name;
 | 
						const char *name = pmu->name;
 | 
				
			||||||
 | 
						const char *pname;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	map = perf_pmu__find_map(pmu);
 | 
						map = perf_pmu__find_map(pmu);
 | 
				
			||||||
	if (!map)
 | 
						if (!map)
 | 
				
			||||||
| 
						 | 
					@ -686,11 +682,9 @@ static void pmu_add_cpu_aliases(struct list_head *head, struct perf_pmu *pmu)
 | 
				
			||||||
			break;
 | 
								break;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if (!is_pmu_core(name)) {
 | 
							if (!is_arm_pmu_core(name)) {
 | 
				
			||||||
			/* check for uncore devices */
 | 
								pname = pe->pmu ? pe->pmu : "cpu";
 | 
				
			||||||
			if (pe->pmu == NULL)
 | 
								if (strncmp(pname, name, strlen(pname)))
 | 
				
			||||||
				continue;
 | 
					 | 
				
			||||||
			if (strncmp(pe->pmu, name, strlen(pe->pmu)))
 | 
					 | 
				
			||||||
				continue;
 | 
									continue;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue