perf/rapl: Fix sysfs_show() initialization for RAPL PMU
This patch fixes a problem with the initialization of the sysfs_show() routine for the RAPL PMU. The current code was wrongly relying on the EVENT_ATTR_STR() macro which uses the events_sysfs_show() function in the x86 PMU code. That function itself was relying on the x86_pmu data structure. Yet RAPL and the core PMU (x86_pmu) have nothing to do with each other. They should therefore not interact with each other. The x86_pmu structure is initialized at boot time based on the host CPU model. When the host CPU is not supported, the x86_pmu remains uninitialized and some of the callbacks it contains are NULL. The false dependency with x86_pmu could potentially cause crashes in case the x86_pmu is not initialized while the RAPL PMU is. This may, for instance, be the case in virtualized environments. This patch fixes the problem by using a private sysfs_show() routine for exporting the RAPL PMU events. Signed-off-by: Stephane Eranian <eranian@google.com> Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org> Link: http://lkml.kernel.org/r/20150113225953.GA21525@thinkpad Cc: vincent.weaver@maine.edu Cc: jolsa@redhat.com Cc: Arnaldo Carvalho de Melo <acme@kernel.org> Cc: Linus Torvalds <torvalds@linux-foundation.org> Signed-off-by: Ingo Molnar <mingo@kernel.org>
This commit is contained in:
parent
f800c25b7a
commit
433678bdc6
1 changed files with 32 additions and 12 deletions
|
@ -103,6 +103,13 @@ static struct kobj_attribute format_attr_##_var = \
|
||||||
|
|
||||||
#define RAPL_CNTR_WIDTH 32 /* 32-bit rapl counters */
|
#define RAPL_CNTR_WIDTH 32 /* 32-bit rapl counters */
|
||||||
|
|
||||||
|
#define RAPL_EVENT_ATTR_STR(_name, v, str) \
|
||||||
|
static struct perf_pmu_events_attr event_attr_##v = { \
|
||||||
|
.attr = __ATTR(_name, 0444, rapl_sysfs_show, NULL), \
|
||||||
|
.id = 0, \
|
||||||
|
.event_str = str, \
|
||||||
|
};
|
||||||
|
|
||||||
struct rapl_pmu {
|
struct rapl_pmu {
|
||||||
spinlock_t lock;
|
spinlock_t lock;
|
||||||
int hw_unit; /* 1/2^hw_unit Joule */
|
int hw_unit; /* 1/2^hw_unit Joule */
|
||||||
|
@ -379,23 +386,36 @@ static struct attribute_group rapl_pmu_attr_group = {
|
||||||
.attrs = rapl_pmu_attrs,
|
.attrs = rapl_pmu_attrs,
|
||||||
};
|
};
|
||||||
|
|
||||||
EVENT_ATTR_STR(energy-cores, rapl_cores, "event=0x01");
|
static ssize_t rapl_sysfs_show(struct device *dev,
|
||||||
EVENT_ATTR_STR(energy-pkg , rapl_pkg, "event=0x02");
|
struct device_attribute *attr,
|
||||||
EVENT_ATTR_STR(energy-ram , rapl_ram, "event=0x03");
|
char *page)
|
||||||
EVENT_ATTR_STR(energy-gpu , rapl_gpu, "event=0x04");
|
{
|
||||||
|
struct perf_pmu_events_attr *pmu_attr = \
|
||||||
|
container_of(attr, struct perf_pmu_events_attr, attr);
|
||||||
|
|
||||||
EVENT_ATTR_STR(energy-cores.unit, rapl_cores_unit, "Joules");
|
if (pmu_attr->event_str)
|
||||||
EVENT_ATTR_STR(energy-pkg.unit , rapl_pkg_unit, "Joules");
|
return sprintf(page, "%s", pmu_attr->event_str);
|
||||||
EVENT_ATTR_STR(energy-ram.unit , rapl_ram_unit, "Joules");
|
|
||||||
EVENT_ATTR_STR(energy-gpu.unit , rapl_gpu_unit, "Joules");
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
RAPL_EVENT_ATTR_STR(energy-cores, rapl_cores, "event=0x01");
|
||||||
|
RAPL_EVENT_ATTR_STR(energy-pkg , rapl_pkg, "event=0x02");
|
||||||
|
RAPL_EVENT_ATTR_STR(energy-ram , rapl_ram, "event=0x03");
|
||||||
|
RAPL_EVENT_ATTR_STR(energy-gpu , rapl_gpu, "event=0x04");
|
||||||
|
|
||||||
|
RAPL_EVENT_ATTR_STR(energy-cores.unit, rapl_cores_unit, "Joules");
|
||||||
|
RAPL_EVENT_ATTR_STR(energy-pkg.unit , rapl_pkg_unit, "Joules");
|
||||||
|
RAPL_EVENT_ATTR_STR(energy-ram.unit , rapl_ram_unit, "Joules");
|
||||||
|
RAPL_EVENT_ATTR_STR(energy-gpu.unit , rapl_gpu_unit, "Joules");
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* we compute in 0.23 nJ increments regardless of MSR
|
* we compute in 0.23 nJ increments regardless of MSR
|
||||||
*/
|
*/
|
||||||
EVENT_ATTR_STR(energy-cores.scale, rapl_cores_scale, "2.3283064365386962890625e-10");
|
RAPL_EVENT_ATTR_STR(energy-cores.scale, rapl_cores_scale, "2.3283064365386962890625e-10");
|
||||||
EVENT_ATTR_STR(energy-pkg.scale, rapl_pkg_scale, "2.3283064365386962890625e-10");
|
RAPL_EVENT_ATTR_STR(energy-pkg.scale, rapl_pkg_scale, "2.3283064365386962890625e-10");
|
||||||
EVENT_ATTR_STR(energy-ram.scale, rapl_ram_scale, "2.3283064365386962890625e-10");
|
RAPL_EVENT_ATTR_STR(energy-ram.scale, rapl_ram_scale, "2.3283064365386962890625e-10");
|
||||||
EVENT_ATTR_STR(energy-gpu.scale, rapl_gpu_scale, "2.3283064365386962890625e-10");
|
RAPL_EVENT_ATTR_STR(energy-gpu.scale, rapl_gpu_scale, "2.3283064365386962890625e-10");
|
||||||
|
|
||||||
static struct attribute *rapl_events_srv_attr[] = {
|
static struct attribute *rapl_events_srv_attr[] = {
|
||||||
EVENT_PTR(rapl_cores),
|
EVENT_PTR(rapl_cores),
|
||||||
|
|
Loading…
Reference in a new issue