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