aa5af0
centosplus kernel patch [bug#12818]
aa5af0
aa5af0
From ac68351410df683a149e7eea09df178884cf2419 Mon Sep 17 00:00:00 2001
aa5af0
From: Marcus Sundberg <marcus.sundberg@aptilo.com>
aa5af0
Date: Mon, 13 Feb 2017 22:57:11 +0100
aa5af0
Subject: [PATCH] [x86] perf: uncore: Avoid kernel panic on missing topology
aa5af0
aa5af0
The uncore code is heavily dependent on the CPU topology mapping code,
aa5af0
so if we do not even have a working topology for the boot CPU we just
aa5af0
give up.
aa5af0
This happens for example on HPE DL360 Gen9 servers with x2APIC enabled
aa5af0
in the firmware settings, where the kernel only finds a single core.
aa5af0
---
aa5af0
 arch/x86/events/intel/uncore.c | 14 ++++++++++++++
aa5af0
 1 file changed, 14 insertions(+)
aa5af0
aa5af0
diff --git a/arch/x86/events/intel/uncore.c b/arch/x86/events/intel/uncore.c
aa5af0
index 77ec6c0..88d79f6 100644
aa5af0
--- a/arch/x86/events/intel/uncore.c
aa5af0
+++ b/arch/x86/events/intel/uncore.c
aa5af0
@@ -1394,6 +1394,20 @@ static int __init intel_uncore_init(void)
aa5af0
 	if (is_kdump_kernel())
aa5af0
 		return -ENODEV;
aa5af0
 
aa5af0
+	/* Sanity check - do not even try to proceed if we have no
aa5af0
+	   working topology mapping for the boot CPU. */
aa5af0
+	if (rh_boot_cpu_data.logical_proc_id < 0 ||
aa5af0
+	    topology_phys_to_logical_pkg(boot_cpu_data.phys_proc_id) < 0) {
aa5af0
+		printk(KERN_ERR
aa5af0
+		       "no mapping between physical and logical CPU, "
aa5af0
+		       "boot CPU phys: %d, logical: %d/%d\n",
aa5af0
+		       (int)boot_cpu_data.phys_proc_id,
aa5af0
+		       (int)rh_boot_cpu_data.logical_proc_id,
aa5af0
+		       (int)topology_phys_to_logical_pkg(
aa5af0
+			       boot_cpu_data.phys_proc_id));
aa5af0
+		return -ENODEV;
aa5af0
+	}
aa5af0
+
aa5af0
 	max_packages = topology_max_packages() * topology_max_die_per_package();
aa5af0
 
aa5af0
 	pret = uncore_pci_init();
aa5af0
-- 
aa5af0
2.5.0
aa5af0