perf stat: Check PMU cpumask file

If user doesn't explicitly specify CPU list, perf-stat only collects
events on CPUs listed in the PMU cpumask file.

Signed-off-by: "Yah, Zheng" <zheng.z.yan@intel.com>
Cc: Andi Kleen <andi@firstfloor.org>
Cc: Ingo Molnar <mingo@elte.hu>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/r/1347263631-23175-3-git-send-email-zheng.z.yan@intel.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
Yan, Zheng
2012-09-10 15:53:50 +08:00
committed by Arnaldo Carvalho de Melo
parent 314d9f63f3
commit 7ae92e744e
7 changed files with 82 additions and 22 deletions

View File

@@ -9,6 +9,7 @@
#include "util.h"
#include "pmu.h"
#include "parse-events.h"
#include "cpumap.h"
#define EVENT_SOURCE_DEVICE_PATH "/bus/event_source/devices/"
@@ -253,6 +254,33 @@ static void pmu_read_sysfs(void)
closedir(dir);
}
static struct cpu_map *pmu_cpumask(char *name)
{
struct stat st;
char path[PATH_MAX];
const char *sysfs;
FILE *file;
struct cpu_map *cpus;
sysfs = sysfs_find_mountpoint();
if (!sysfs)
return NULL;
snprintf(path, PATH_MAX,
"%s/bus/event_source/devices/%s/cpumask", sysfs, name);
if (stat(path, &st) < 0)
return NULL;
file = fopen(path, "r");
if (!file)
return NULL;
cpus = cpu_map__read(file);
fclose(file);
return cpus;
}
static struct perf_pmu *pmu_lookup(char *name)
{
struct perf_pmu *pmu;
@@ -275,6 +303,8 @@ static struct perf_pmu *pmu_lookup(char *name)
if (!pmu)
return NULL;
pmu->cpus = pmu_cpumask(name);
pmu_aliases(name, &aliases);
INIT_LIST_HEAD(&pmu->format);