Skip to content

Commit 50b5607

Browse files
Hao Chenwilldeacon
authored andcommitted
drivers/perf: hisi: use cpuhp_state_remove_instance_nocalls() for hisi_hns3_pmu uninit process
When tearing down a 'hisi_hns3' PMU, we mistakenly run the CPU hotplug callbacks after the device has been unregistered, leading to fireworks when we try to execute empty function callbacks within the driver: | Unable to handle kernel NULL pointer dereference at virtual address 0000000000000000 | CPU: 0 PID: 15 Comm: cpuhp/0 Tainted: G W O 5.12.0-rc4+ #1 | Hardware name: , BIOS KpxxxFPGA 1P B600 V143 04/22/2021 | pstate: 80400009 (Nzcv daif +PAN -UAO -TCO BTYPE=--) | pc : perf_pmu_migrate_context+0x98/0x38c | lr : perf_pmu_migrate_context+0x94/0x38c | | Call trace: | perf_pmu_migrate_context+0x98/0x38c | hisi_hns3_pmu_offline_cpu+0x104/0x12c [hisi_hns3_pmu] Use cpuhp_state_remove_instance_nocalls() instead of cpuhp_state_remove_instance() so that the notifiers don't execute after the PMU device has been unregistered. Fixes: 66637ab ("drivers/perf: hisi: add driver for HNS3 PMU") Signed-off-by: Hao Chen <[email protected]> Signed-off-by: Jijie Shao <[email protected]> Reviewed-by: Yicong Yang <[email protected]> Link: https://lore.kernel.org/r/[email protected] [will: Rewrote commit message] Signed-off-by: Will Deacon <[email protected]>
1 parent 1f33cde commit 50b5607

File tree

1 file changed

+4
-4
lines changed

1 file changed

+4
-4
lines changed

drivers/perf/hisilicon/hns3_pmu.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1556,8 +1556,8 @@ static int hns3_pmu_init_pmu(struct pci_dev *pdev, struct hns3_pmu *hns3_pmu)
15561556
ret = perf_pmu_register(&hns3_pmu->pmu, hns3_pmu->pmu.name, -1);
15571557
if (ret) {
15581558
pci_err(pdev, "failed to register perf PMU, ret = %d.\n", ret);
1559-
cpuhp_state_remove_instance(CPUHP_AP_PERF_ARM_HNS3_PMU_ONLINE,
1560-
&hns3_pmu->node);
1559+
cpuhp_state_remove_instance_nocalls(CPUHP_AP_PERF_ARM_HNS3_PMU_ONLINE,
1560+
&hns3_pmu->node);
15611561
}
15621562

15631563
return ret;
@@ -1568,8 +1568,8 @@ static void hns3_pmu_uninit_pmu(struct pci_dev *pdev)
15681568
struct hns3_pmu *hns3_pmu = pci_get_drvdata(pdev);
15691569

15701570
perf_pmu_unregister(&hns3_pmu->pmu);
1571-
cpuhp_state_remove_instance(CPUHP_AP_PERF_ARM_HNS3_PMU_ONLINE,
1572-
&hns3_pmu->node);
1571+
cpuhp_state_remove_instance_nocalls(CPUHP_AP_PERF_ARM_HNS3_PMU_ONLINE,
1572+
&hns3_pmu->node);
15731573
}
15741574

15751575
static int hns3_pmu_init_dev(struct pci_dev *pdev)

0 commit comments

Comments
 (0)