From: Yinghai Lu <yinghai@kernel.org>
To: Ingo Molnar <mingo@elte.hu>, Thomas Gleixner <tglx@linutronix.de>,
"H. Peter Anvin" <hpa@zytor.com>
Cc: linux-kernel@vger.kernel.org, Stoney Wang <song-bo.wang@hp.com>,
Yinghai Lu <yinghai@kernel.org>,
stable@kernel.org
Subject: [PATCH] x86, apic: Check fadt x2apic phys in x2apic_phys_probe()
Date: Mon, 4 Feb 2013 12:29:27 -0800 [thread overview]
Message-ID: <1360009767-3633-1-git-send-email-yinghai@kernel.org> (raw)
In-Reply-To: <20130204110304.GD24173@gmail.com>
From: Stoney Wang <song-bo.wang@hp.com>
When HP ProLiant DL980 G7 Server boot without x2apic_phys, there will be
intermittent lost interrupts and could result in a hang or data loss.
Those systems only work with x2apic phys mode so BIOS set
ACPI_FADT_APIC_PHYSICAL in FADT table.
Also because all apicids are less then 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 specify x2apic_phys, or FADT indicates PHYSICAL.
During madt oem check, apic driver is set with xapic logical or
xapic phys driver at first.
Later enable_IR_x2apic() will enable x2apic_mode.
After that, x2apic_phys_probe() will install right x2apic phys driver
if user specify x2apic_phys,
but will skip and let x2apic_cluster_probe to take over to install
wrong apic driver (x2apic cluster) when FADT indicates
PHYSICAL, because x2apic_phys_probe does not check FADT PHYSICAL.
Add checking x2apic_fadt_phys in x2apic_phys_probe() to fix the problem.
-v3: update the change according to Ingo.
[ changelog, and simplify code - Yinghai Lu ]
Signed-off-by: Stoney Wang <song-bo.wang@hp.com>
Signed-off-by: Yinghai Lu <yinghai@kernel.org>
Cc: stable@kernel.org
---
arch/x86/kernel/apic/x2apic_phys.c | 21 +++++++++++----------
1 file changed, 11 insertions(+), 10 deletions(-)
Index: linux-2.6/arch/x86/kernel/apic/x2apic_phys.c
===================================================================
--- linux-2.6.orig/arch/x86/kernel/apic/x2apic_phys.c
+++ linux-2.6/arch/x86/kernel/apic/x2apic_phys.c
@@ -20,18 +20,19 @@ static int set_x2apic_phys_mode(char *ar
}
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
@@ -82,7 +83,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;
next prev parent reply other threads:[~2013-02-04 20:30 UTC|newest]
Thread overview: 23+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-01-15 1:50 [PATCH] x86/apic: check FADT settings after enable x2apic Stoney Wang
2013-01-28 5:05 ` Wang, Song-Bo (Stoney)
2013-01-28 6:57 ` Yinghai Lu
2013-01-28 10:11 ` Ingo Molnar
2013-01-28 18:10 ` Yinghai Lu
2013-01-29 7:47 ` Ingo Molnar
2013-01-29 8:43 ` Wang, Song-Bo (Stoney)
2013-01-29 8:49 ` Ingo Molnar
2013-01-29 21:30 ` Yinghai Lu
2013-01-29 21:52 ` Yinghai Lu
2013-01-31 11:32 ` Ingo Molnar
2013-01-31 15:56 ` Yinghai Lu
2013-02-04 6:41 ` Wang, Song-Bo (Stoney)
2013-02-04 11:03 ` Ingo Molnar
2013-02-04 20:29 ` Yinghai Lu [this message]
2013-02-05 12:24 ` [PATCH] x86, apic: Check fadt x2apic phys in x2apic_phys_probe() Ingo Molnar
2013-02-05 16:53 ` Yinghai Lu
2013-02-06 13:16 ` Ingo Molnar
2013-02-06 17:10 ` Yinghai Lu
2013-02-07 18:53 ` [PATCH v4] " Yinghai Lu
2013-02-11 12:37 ` [tip:x86/urgent] x86/apic: Work around boot failure on HP ProLiant DL980 G7 Server systems tip-bot for Stoney Wang
2013-02-18 8:52 ` [PATCH v4] x86, apic: Check fadt x2apic phys in x2apic_phys_probe() Lin-Bao Zhang
2013-02-18 17:13 ` Yinghai Lu
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1360009767-3633-1-git-send-email-yinghai@kernel.org \
--to=yinghai@kernel.org \
--cc=hpa@zytor.com \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@elte.hu \
--cc=song-bo.wang@hp.com \
--cc=stable@kernel.org \
--cc=tglx@linutronix.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.