Skip to content

Commit 0036fb0

Browse files
Stephane EranianPeter Zijlstra
authored andcommitted
perf/x86/rapl: fix AMD event handling
The RAPL events exposed under /sys/devices/power/events should only reflect what the underlying hardware actually support. This is how it works on Intel RAPL and Intel core/uncore PMUs in general. But on AMD, this was not the case. All possible RAPL events were advertised. This is what it showed on an AMD Fam17h: $ ls /sys/devices/power/events/ energy-cores energy-gpu energy-pkg energy-psys energy-ram energy-cores.scale energy-gpu.scale energy-pkg.scale energy-psys.scale energy-ram.scale energy-cores.unit energy-gpu.unit energy-pkg.unit energy-psys.unit energy-ram.unit Yet, on AMD Fam17h, only energy-pkg is supported. This patch fixes the problem. Given the way perf_msr_probe() works, the amd_rapl_msrs[] table has to have all entries filled out and in particular the group field, otherwise perf_msr_probe() defaults to making the event visible. With the patch applied, the kernel now only shows was is actually supported: $ ls /sys/devices/power/events/ energy-pkg energy-pkg.scale energy-pkg.unit The patch also uses the RAPL_MSR_MASK because only the 32-bits LSB of the RAPL counters are relevant when reading power consumption. Signed-off-by: Stephane Eranian <eranian@google.com> Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org> Link: https://lkml.kernel.org/r/20220105185659.643355-1-eranian@google.com
1 parent 96fd2e8 commit 0036fb0

File tree

1 file changed

+6
-3
lines changed

1 file changed

+6
-3
lines changed

arch/x86/events/rapl.c

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -536,11 +536,14 @@ static struct perf_msr intel_rapl_spr_msrs[] = {
536536
* - perf_msr_probe(PERF_RAPL_MAX)
537537
* - want to use same event codes across both architectures
538538
*/
539-
static struct perf_msr amd_rapl_msrs[PERF_RAPL_MAX] = {
540-
[PERF_RAPL_PKG] = { MSR_AMD_PKG_ENERGY_STATUS, &rapl_events_pkg_group, test_msr },
539+
static struct perf_msr amd_rapl_msrs[] = {
540+
[PERF_RAPL_PP0] = { 0, &rapl_events_cores_group, 0, false, 0 },
541+
[PERF_RAPL_PKG] = { MSR_AMD_PKG_ENERGY_STATUS, &rapl_events_pkg_group, test_msr, false, RAPL_MSR_MASK },
542+
[PERF_RAPL_RAM] = { 0, &rapl_events_ram_group, 0, false, 0 },
543+
[PERF_RAPL_PP1] = { 0, &rapl_events_gpu_group, 0, false, 0 },
544+
[PERF_RAPL_PSYS] = { 0, &rapl_events_psys_group, 0, false, 0 },
541545
};
542546

543-
544547
static int rapl_cpu_offline(unsigned int cpu)
545548
{
546549
struct rapl_pmu *pmu = cpu_to_rapl_pmu(cpu);

0 commit comments

Comments
 (0)