114 lines
4.5 KiB
Diff
114 lines
4.5 KiB
Diff
From 7901f6e0c3c188badd67a49ba546df8da2f0a123 Mon Sep 17 00:00:00 2001
|
|
From: Qi Liu <liuqi115@huawei.com>
|
|
Date: Thu, 16 Jul 2020 17:19:25 +0800
|
|
Subject: [PATCH 08/55] drivers/perf: Fix kernel panic when rmmod PMU modules
|
|
during perf sampling
|
|
|
|
mainline inclusion
|
|
from mainline-v5.8-rc1
|
|
commit bdc5c744c7b6457d18a95c26769dad0e7f480a08
|
|
category: bugfix
|
|
bugzilla: https://gitee.com/openeuler/kernel/issues/I8AU2M
|
|
|
|
Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=bdc5c744c7b6457d18a95c26769dad0e7f480a08
|
|
|
|
----------------------------------------------------------------------
|
|
|
|
When users try to remove PMU modules during perf sampling, kernel panic
|
|
will happen because the pmu->read() is a NULL pointer here.
|
|
|
|
INFO on HiSilicon hip08 platform as follow:
|
|
pc : hisi_uncore_pmu_event_update+0x30/0xa4 [hisi_uncore_pmu]
|
|
lr : hisi_uncore_pmu_read+0x20/0x2c [hisi_uncore_pmu]
|
|
sp : ffff800010103e90
|
|
x29: ffff800010103e90 x28: ffff0027db0c0e40
|
|
x27: ffffa29a76f129d8 x26: ffffa29a77ceb000
|
|
x25: ffffa29a773a5000 x24: ffffa29a77392000
|
|
x23: ffffddffe5943f08 x22: ffff002784285960
|
|
x21: ffff002784285800 x20: ffff0027d2e76c80
|
|
x19: ffff0027842859e0 x18: ffff80003498bcc8
|
|
x17: ffffa29a76afe910 x16: ffffa29a7583f530
|
|
x15: 16151a1512061a1e x14: 0000000000000000
|
|
x13: ffffa29a76f1e238 x12: 0000000000000001
|
|
x11: 0000000000000400 x10: 00000000000009f0
|
|
x9 : ffff8000107b3e70 x8 : ffff0027db0c1890
|
|
x7 : ffffa29a773a7000 x6 : 00000007f5131013
|
|
x5 : 00000007f5131013 x4 : 09f257d417c00000
|
|
x3 : 00000002187bd7ce x2 : ffffa29a38f0f0d8
|
|
x1 : ffffa29a38eae268 x0 : ffff0027d2e76c80
|
|
Call trace:
|
|
hisi_uncore_pmu_event_update+0x30/0xa4 [hisi_uncore_pmu]
|
|
hisi_uncore_pmu_read+0x20/0x2c [hisi_uncore_pmu]
|
|
__perf_event_read+0x1a0/0x1f8
|
|
flush_smp_call_function_queue+0xa0/0x160
|
|
generic_smp_call_function_single_interrupt+0x18/0x20
|
|
handle_IPI+0x31c/0x4dc
|
|
gic_handle_irq+0x2c8/0x310
|
|
el1_irq+0xcc/0x180
|
|
arch_cpu_idle+0x4c/0x20c
|
|
default_idle_call+0x20/0x30
|
|
do_idle+0x1b4/0x270
|
|
cpu_startup_entry+0x28/0x30
|
|
secondary_start_kernel+0x1a4/0x1fc
|
|
|
|
To solve the above issue, current module should be registered to kernel,
|
|
so that try_module_get() can be invoked when perf sampling starts. This
|
|
adds the reference counting of module and could prevent users from removing
|
|
modules during sampling.
|
|
|
|
Reported-by: Haifeng Wang <wang.wanghaifeng@huawei.com>
|
|
Signed-off-by: Qi Liu <liuqi115@huawei.com>
|
|
Reviewed-by: John Garry <john.garry@huawei.com>
|
|
Link: https://lore.kernel.org/r/1594891165-8228-1-git-send-email-liuqi115@huawei.com
|
|
Signed-off-by: Will Deacon <will@kernel.org>
|
|
Signed-off-by: hongrongxuan <hongrongxuan@huawei.com>
|
|
|
|
Conflicts:
|
|
drivers/perf/fsl_imx8_ddr_perf.c
|
|
drivers/perf/arm_smmuv3_pmu.c
|
|
---
|
|
drivers/perf/hisilicon/hisi_uncore_ddrc_pmu.c | 1 +
|
|
drivers/perf/hisilicon/hisi_uncore_hha_pmu.c | 1 +
|
|
drivers/perf/hisilicon/hisi_uncore_l3c_pmu.c | 1 +
|
|
3 files changed, 3 insertions(+)
|
|
|
|
diff --git a/drivers/perf/hisilicon/hisi_uncore_ddrc_pmu.c b/drivers/perf/hisilicon/hisi_uncore_ddrc_pmu.c
|
|
index b3488ae1f2b8..620fa1345150 100644
|
|
--- a/drivers/perf/hisilicon/hisi_uncore_ddrc_pmu.c
|
|
+++ b/drivers/perf/hisilicon/hisi_uncore_ddrc_pmu.c
|
|
@@ -386,6 +386,7 @@ static int hisi_ddrc_pmu_probe(struct platform_device *pdev)
|
|
ddrc_pmu->sccl_id, ddrc_pmu->index_id);
|
|
ddrc_pmu->pmu = (struct pmu) {
|
|
.name = name,
|
|
+ .module = THIS_MODULE,
|
|
.task_ctx_nr = perf_invalid_context,
|
|
.event_init = hisi_uncore_pmu_event_init,
|
|
.pmu_enable = hisi_uncore_pmu_enable,
|
|
diff --git a/drivers/perf/hisilicon/hisi_uncore_hha_pmu.c b/drivers/perf/hisilicon/hisi_uncore_hha_pmu.c
|
|
index f0215d50d84d..33a0da941be2 100644
|
|
--- a/drivers/perf/hisilicon/hisi_uncore_hha_pmu.c
|
|
+++ b/drivers/perf/hisilicon/hisi_uncore_hha_pmu.c
|
|
@@ -397,6 +397,7 @@ static int hisi_hha_pmu_probe(struct platform_device *pdev)
|
|
hha_pmu->sccl_id, hha_pmu->index_id);
|
|
hha_pmu->pmu = (struct pmu) {
|
|
.name = name,
|
|
+ .module = THIS_MODULE,
|
|
.task_ctx_nr = perf_invalid_context,
|
|
.event_init = hisi_uncore_pmu_event_init,
|
|
.pmu_enable = hisi_uncore_pmu_enable,
|
|
diff --git a/drivers/perf/hisilicon/hisi_uncore_l3c_pmu.c b/drivers/perf/hisilicon/hisi_uncore_l3c_pmu.c
|
|
index 11563e29d983..92485f00dcc8 100644
|
|
--- a/drivers/perf/hisilicon/hisi_uncore_l3c_pmu.c
|
|
+++ b/drivers/perf/hisilicon/hisi_uncore_l3c_pmu.c
|
|
@@ -387,6 +387,7 @@ static int hisi_l3c_pmu_probe(struct platform_device *pdev)
|
|
l3c_pmu->sccl_id, l3c_pmu->index_id);
|
|
l3c_pmu->pmu = (struct pmu) {
|
|
.name = name,
|
|
+ .module = THIS_MODULE,
|
|
.task_ctx_nr = perf_invalid_context,
|
|
.event_init = hisi_uncore_pmu_event_init,
|
|
.pmu_enable = hisi_uncore_pmu_enable,
|
|
--
|
|
2.27.0
|
|
|