public inbox for linux-perf-users@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH] perf/x86/intel/uncore: Re-register PMU on PCI device hot-add
@ 2026-04-16  5:45 Guixin Liu
  2026-04-16  6:16 ` sashiko-bot
  0 siblings, 1 reply; 2+ messages in thread
From: Guixin Liu @ 2026-04-16  5:45 UTC (permalink / raw)
  To: Peter Zijlstra, Ingo Molnar, Arnaldo Carvalho de Melo,
	Namhyung Kim, Mark Rutland, Alexander Shishkin, Jiri Olsa,
	Ian Rogers, Adrian Hunter, James Clark, Thomas Gleixner,
	Borislav Petkov, Dave Hansen, hpa, Kan Liang
  Cc: x86, linux-perf-users, Xunlei Pang, oliver.yang

When an uncore PCI device is removed and then rescanned back, the PMU
and its associated box are unregistered during removal but never
re-registered during the rescan. This causes a NULL pointer dereference
(on box) when the device is removed again.

Reproduction steps:
1. Boot the system with uncore PCI devices enumerated
2. Remove an uncore PCI device (e.g., via sysfs or physical removal)
   - BUS_NOTIFY_DEL_DEVICE triggers uncore_pci_pmu_unregister()
   - pmu->boxes[die] is set to NULL and the box is freed
3. Rescan the PCI bus to re-enumerate the device
   - The PCI device appears again, but uncore does not re-register
     the PMU/box because uncore_pci_pmus_register() only runs during
     module initialization, not on PCI hotplug events
4. Remove the device again
   - BUS_NOTIFY_DEL_DEVICE triggers uncore_pci_pmu_unregister()
   - box = pmu->boxes[die] returns NULL → BUG() / crash

Root cause:
The uncore subsystem only registers PMUs and boxes during module
initialization (uncore_pci_pmus_register). It does not handle PCI
hotplug/rescan events to re-register PMUs when devices reappear.

Fix:
Extend the uncore PCI bus notifier to handle BUS_NOTIFY_ADD_DEVICE
events. When a previously-registered uncore PCI device is re-added,
call uncore_pci_pmu_register() to recreate the box and restore the
PMU state. This ensures that subsequent removal operations work
correctly.

Fixes: 42839ef4a20a ("perf/x86/intel/uncore: Generic support for the PCI type of uncore blocks")
Signed-off-by: Guixin Liu <kanie@linux.alibaba.com>
---
 arch/x86/events/intel/uncore.c | 14 +++++++++++---
 1 file changed, 11 insertions(+), 3 deletions(-)

diff --git a/arch/x86/events/intel/uncore.c b/arch/x86/events/intel/uncore.c
index 786bd51a0d89..211318733a35 100644
--- a/arch/x86/events/intel/uncore.c
+++ b/arch/x86/events/intel/uncore.c
@@ -1272,8 +1272,7 @@ static int uncore_bus_notify(struct notifier_block *nb,
 	struct intel_uncore_pmu *pmu;
 	int die;
 
-	/* Unregister the PMU when the device is going to be deleted. */
-	if (action != BUS_NOTIFY_DEL_DEVICE)
+	if (action != BUS_NOTIFY_DEL_DEVICE && action != BUS_NOTIFY_ADD_DEVICE)
 		return NOTIFY_DONE;
 
 	pmu = uncore_pci_find_dev_pmu(pdev, ids);
@@ -1283,7 +1282,16 @@ static int uncore_bus_notify(struct notifier_block *nb,
 	if (uncore_pci_get_dev_die_info(pdev, &die))
 		return NOTIFY_DONE;
 
-	uncore_pci_pmu_unregister(pmu, die);
+	switch (action) {
+	case BUS_NOTIFY_DEL_DEVICE:
+		uncore_pci_pmu_unregister(pmu, die);
+		break;
+	case BUS_NOTIFY_ADD_DEVICE:
+		uncore_pci_pmu_register(pdev, pmu->type, pmu, die);
+		break;
+	default:
+		return NOTIFY_DONE;
+	}
 
 	return NOTIFY_OK;
 }
-- 
2.32.0.3.g01195cf9f


^ permalink raw reply related	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2026-04-16  6:16 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-04-16  5:45 [PATCH] perf/x86/intel/uncore: Re-register PMU on PCI device hot-add Guixin Liu
2026-04-16  6:16 ` sashiko-bot

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox