diff options
author | Fernando Luis VazquezCao <fernando@oss.ntt.co.jp> | 2007-05-02 13:27:17 -0400 |
---|---|---|
committer | Andi Kleen <andi@basil.nowhere.org> | 2007-05-02 13:27:17 -0400 |
commit | 3144c332fa2ee4c4b9804aae5fe31098f04bffd9 (patch) | |
tree | b69b89eef10b169f8486c18cdaf374dd2339eba2 /arch | |
parent | 4312fa8157f5ebdaf36e615cf40f9d7a6137a22c (diff) |
[PATCH] x86-64: use safe_apic_wait_icr_idle in smpboot.c - x86_64
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')
-rw-r--r-- | arch/x86_64/kernel/smpboot.c | 7 |
1 files changed, 5 insertions, 2 deletions
diff --git a/arch/x86_64/kernel/smpboot.c b/arch/x86_64/kernel/smpboot.c index f2a234b390e8..082f478fb777 100644 --- a/arch/x86_64/kernel/smpboot.c +++ b/arch/x86_64/kernel/smpboot.c | |||
@@ -391,7 +391,8 @@ static void inquire_remote_apic(int apicid) | |||
391 | { | 391 | { |
392 | unsigned i, regs[] = { APIC_ID >> 4, APIC_LVR >> 4, APIC_SPIV >> 4 }; | 392 | unsigned i, regs[] = { APIC_ID >> 4, APIC_LVR >> 4, APIC_SPIV >> 4 }; |
393 | char *names[] = { "ID", "VERSION", "SPIV" }; | 393 | char *names[] = { "ID", "VERSION", "SPIV" }; |
394 | int timeout, status; | 394 | int timeout; |
395 | unsigned int status; | ||
395 | 396 | ||
396 | printk(KERN_INFO "Inquiring remote APIC #%d...\n", apicid); | 397 | printk(KERN_INFO "Inquiring remote APIC #%d...\n", apicid); |
397 | 398 | ||
@@ -401,7 +402,9 @@ static void inquire_remote_apic(int apicid) | |||
401 | /* | 402 | /* |
402 | * Wait for idle. | 403 | * Wait for idle. |
403 | */ | 404 | */ |
404 | apic_wait_icr_idle(); | 405 | status = safe_apic_wait_icr_idle(); |
406 | if (status) | ||
407 | printk("a previous APIC delivery may have failed\n"); | ||
405 | 408 | ||
406 | apic_write(APIC_ICR2, SET_APIC_DEST_FIELD(apicid)); | 409 | apic_write(APIC_ICR2, SET_APIC_DEST_FIELD(apicid)); |
407 | apic_write(APIC_ICR, APIC_DM_REMRD | regs[i]); | 410 | apic_write(APIC_ICR, APIC_DM_REMRD | regs[i]); |