2018-01-22 06:15:46

by Xiao Liang

[permalink] [raw]
Subject: [PATCH v1 1/1] perf/x86/amd/power: do not load amd power module in intel platform

"power" module can be loaded if it is not amd processor.

And user cannot unload it after loaded it. The following call trace generated
when tried to unload it.

BUG: unable to handle kernel NULL pointer dereference at (null)
IP: __list_del_entry_valid+0x29/0x90
PGD 0 P4D 0
Oops: 0000 [#1] SMP PTI
CPU: 1 PID: 26046 Comm: modprobe Not tainted 4.14.13-300.fc27.x86_64 #1
Hardware name: Xen HVM domU, BIOS 4.9.1 12/12/2017
task: ffff9a138f8dddc0 task.stack: ffffb0ec41cbc000
RIP: 0010:__list_del_entry_valid+0x29/0x90

Call Trace:
perf_pmu_unregister+0x25/0xf0
amd_power_pmu_exit+0x1c/0xd23 [power]
SyS_delete_module+0x1a8/0x2b0
? exit_to_usermode_loop+0x8f/0xb0
entry_SYSCALL_64_fastpath+0x20/0x83
RIP: 0033:0x7fb67d78e5c7

Signed-off-by: Xiao Liang <[email protected]>
---
arch/x86/events/amd/power.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/arch/x86/events/amd/power.c b/arch/x86/events/amd/power.c
index a6eee5ac4f58..2aefacf5c5b2 100644
--- a/arch/x86/events/amd/power.c
+++ b/arch/x86/events/amd/power.c
@@ -277,7 +277,7 @@ static int __init amd_power_pmu_init(void)
int ret;

if (!x86_match_cpu(cpu_match))
- return 0;
+ return -ENODEV;

if (!boot_cpu_has(X86_FEATURE_ACC_POWER))
return -ENODEV;
--
2.14.3



Subject: [tip:x86/urgent] perf/x86/amd/power: Do not load AMD power module on !AMD platforms

Commit-ID: 40d4071ce2d20840d224b4a77b5dc6f752c9ab15
Gitweb: https://git.kernel.org/tip/40d4071ce2d20840d224b4a77b5dc6f752c9ab15
Author: Xiao Liang <[email protected]>
AuthorDate: Mon, 22 Jan 2018 14:12:52 +0800
Committer: Thomas Gleixner <[email protected]>
CommitDate: Wed, 24 Jan 2018 13:00:35 +0100

perf/x86/amd/power: Do not load AMD power module on !AMD platforms

The AMD power module can be loaded on non AMD platforms, but unload fails
with the following Oops:

BUG: unable to handle kernel NULL pointer dereference at (null)
IP: __list_del_entry_valid+0x29/0x90
Call Trace:
perf_pmu_unregister+0x25/0xf0
amd_power_pmu_exit+0x1c/0xd23 [power]
SyS_delete_module+0x1a8/0x2b0
? exit_to_usermode_loop+0x8f/0xb0
entry_SYSCALL_64_fastpath+0x20/0x83

Return -ENODEV instead of 0 from the module init function if the CPU does
not match.

Fixes: c7ab62bfbe0e ("perf/x86/amd/power: Add AMD accumulated power reporting mechanism")
Signed-off-by: Xiao Liang <[email protected]>
Signed-off-by: Thomas Gleixner <[email protected]>
Cc: [email protected]
Link: https://lkml.kernel.org/r/[email protected]

---
arch/x86/events/amd/power.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/arch/x86/events/amd/power.c b/arch/x86/events/amd/power.c
index a6eee5a..2aefacf 100644
--- a/arch/x86/events/amd/power.c
+++ b/arch/x86/events/amd/power.c
@@ -277,7 +277,7 @@ static int __init amd_power_pmu_init(void)
int ret;

if (!x86_match_cpu(cpu_match))
- return 0;
+ return -ENODEV;

if (!boot_cpu_has(X86_FEATURE_ACC_POWER))
return -ENODEV;