Patchwork [3.5.y.z,extended,stable] Patch "x86/apic: Work around boot failure on HP ProLiant DL980 G7" has been added to staging queue

mail settings
Submitter Herton Ronaldo Krzesinski
Date Feb. 15, 2013, 5:03 p.m.
Message ID <>
Download mbox | patch
Permalink /patch/220775/
State New
Headers show


Herton Ronaldo Krzesinski - Feb. 15, 2013, 5:03 p.m.
This is a note to let you know that I have just added a patch titled

    x86/apic: Work around boot failure on HP ProLiant DL980 G7

to the linux-3.5.y-queue branch of the 3.5.y.z extended stable tree 
which can be found at:;a=shortlog;h=refs/heads/linux-3.5.y-queue

If you, or anyone else, feels it should not be added to this tree, please 
reply to this email.

For more information about the 3.5.y.z tree, see



From 3da57fe480d3b863d869a5b8c7b246fac43bca7a Mon Sep 17 00:00:00 2001
From: Stoney Wang <>
Date: Thu, 7 Feb 2013 10:53:02 -0800
Subject: [PATCH] x86/apic: Work around boot failure on HP ProLiant DL980 G7
 Server systems

commit cb214ede7657db458fd0b2a25ea0b28dbf900ebc upstream.

When a HP ProLiant DL980 G7 Server boots a regular kernel,
there will be intermittent lost interrupts which could
result in a hang or (in extreme cases) data loss.

The reason is that this system only supports x2apic physical
mode, while the kernel boots with a logical-cluster default

This bug can be worked around by specifying the "x2apic_phys" or
"nox2apic" boot option, but we want to handle this system
without requiring manual workarounds.

As all apicids are smaller than 255, BIOS need to pass the
control to the OS with xapic mode, according to x2apic-spec,
chapter 2.9.

Current code handle x2apic when BIOS pass with xapic mode

When user specifies x2apic_phys, or FADT indicates PHYSICAL:

1. During madt oem check, apic driver is set with xapic logical
   or xapic phys driver at first.

2. enable_IR_x2apic() will enable x2apic_mode.

3. if user specifies x2apic_phys on the boot line, x2apic_phys_probe()
   will install the correct x2apic phys driver and use x2apic phys mode.
   Otherwise it will skip the driver will let x2apic_cluster_probe to
   take over to install x2apic cluster driver (wrong one) even though FADT
   indicates PHYSICAL, because x2apic_phys_probe does not check

Add checking x2apic_fadt_phys in x2apic_phys_probe() to fix the

Signed-off-by: Stoney Wang <>
[ updated the changelog and simplified the code ]
Signed-off-by: Yinghai Lu <>
Signed-off-by: Ingo Molnar <>
Signed-off-by: Herton Ronaldo Krzesinski <>
 arch/x86/kernel/apic/x2apic_phys.c |   21 +++++++++++----------
 1 file changed, 11 insertions(+), 10 deletions(-)



diff --git a/arch/x86/kernel/apic/x2apic_phys.c b/arch/x86/kernel/apic/x2apic_phys.c
index c17e982..d14fee3 100644
--- a/arch/x86/kernel/apic/x2apic_phys.c
+++ b/arch/x86/kernel/apic/x2apic_phys.c
@@ -20,18 +20,19 @@  static int set_x2apic_phys_mode(char *arg)
 early_param("x2apic_phys", set_x2apic_phys_mode);

-static int x2apic_acpi_madt_oem_check(char *oem_id, char *oem_table_id)
+static bool x2apic_fadt_phys(void)
-	if (x2apic_phys)
-		return x2apic_enabled();
-	else if ((acpi_gbl_FADT.header.revision >= FADT2_REVISION_ID) &&
-		(acpi_gbl_FADT.flags & ACPI_FADT_APIC_PHYSICAL) &&
-		x2apic_enabled()) {
+	if ((acpi_gbl_FADT.header.revision >= FADT2_REVISION_ID) &&
+		(acpi_gbl_FADT.flags & ACPI_FADT_APIC_PHYSICAL)) {
 		printk(KERN_DEBUG "System requires x2apic physical mode\n");
-		return 1;
+		return true;
-	else
-		return 0;
+	return false;
+static int x2apic_acpi_madt_oem_check(char *oem_id, char *oem_table_id)
+	return x2apic_enabled() && (x2apic_phys || x2apic_fadt_phys());

 static void
@@ -114,7 +115,7 @@  static void init_x2apic_ldr(void)

 static int x2apic_phys_probe(void)
-	if (x2apic_mode && x2apic_phys)
+	if (x2apic_mode && (x2apic_phys || x2apic_fadt_phys()))
 		return 1;

 	return apic == &apic_x2apic_phys;