aboutsummaryrefslogtreecommitdiffstats
path: root/arch/i386
diff options
context:
space:
mode:
authorFernando Luis VazquezCao <fernando@oss.ntt.co.jp>2007-05-02 13:27:17 -0400
committerAndi Kleen <andi@basil.nowhere.org>2007-05-02 13:27:17 -0400
commit4312fa8157f5ebdaf36e615cf40f9d7a6137a22c (patch)
tree8232780b1c1f73a3145905291212b611e4c5ad02 /arch/i386
parentea8c733b98b73289421ed8f8fc15cfbce3adc3bc (diff)
[PATCH] i386: use safe_apic_wait_icr_idle in smpboot.c
__inquire_remote_apic is used for APIC debugging, so use safe_apic_wait_icr_idle instead of apic_wait_icr_idle to avoid possible lockups when APIC delivery fails. Signed-off-by: Fernando Luis Vazquez Cao <fernando@oss.ntt.co.jp> Signed-off-by: Andi Kleen <ak@suse.de>
Diffstat (limited to 'arch/i386')
-rw-r--r--arch/i386/kernel/smpboot.c7
1 files changed, 5 insertions, 2 deletions
diff --git a/arch/i386/kernel/smpboot.c b/arch/i386/kernel/smpboot.c
index 94dce14a1b37..a768eceeac37 100644
--- a/arch/i386/kernel/smpboot.c
+++ b/arch/i386/kernel/smpboot.c
@@ -521,7 +521,8 @@ static inline void __inquire_remote_apic(int apicid)
521{ 521{
522 int i, regs[] = { APIC_ID >> 4, APIC_LVR >> 4, APIC_SPIV >> 4 }; 522 int i, regs[] = { APIC_ID >> 4, APIC_LVR >> 4, APIC_SPIV >> 4 };
523 char *names[] = { "ID", "VERSION", "SPIV" }; 523 char *names[] = { "ID", "VERSION", "SPIV" };
524 int timeout, status; 524 int timeout;
525 unsigned long status;
525 526
526 printk("Inquiring remote APIC #%d...\n", apicid); 527 printk("Inquiring remote APIC #%d...\n", apicid);
527 528
@@ -531,7 +532,9 @@ static inline void __inquire_remote_apic(int apicid)
531 /* 532 /*
532 * Wait for idle. 533 * Wait for idle.
533 */ 534 */
534 apic_wait_icr_idle(); 535 status = safe_apic_wait_icr_idle();
536 if (status)
537 printk("a previous APIC delivery may have failed\n");
535 538
536 apic_write_around(APIC_ICR2, SET_APIC_DEST_FIELD(apicid)); 539 apic_write_around(APIC_ICR2, SET_APIC_DEST_FIELD(apicid));
537 apic_write_around(APIC_ICR, APIC_DM_REMRD | regs[i]); 540 apic_write_around(APIC_ICR, APIC_DM_REMRD | regs[i]);