Commit:     f2b218dd6199983b120a96bc6531c1b81f4090d8
Parent:     de938c51d5fec4ae03af64b06beb15d4423ec611
Author:     Fernando Luis VazquezCao <[EMAIL PROTECTED]>
AuthorDate: Wed May 2 19:27:17 2007 +0200
Committer:  Andi Kleen <[EMAIL PROTECTED]>
CommitDate: Wed May 2 19:27:17 2007 +0200

    [PATCH] i386: safe_apic_wait_icr_idle - i386
    apic_wait_icr_idle looks like this:
    static __inline__ void apic_wait_icr_idle(void)
      while (apic_read(APIC_ICR) & APIC_ICR_BUSY)
    The busy loop in this function would not be problematic if the
    corresponding status bit in the ICR were always updated, but that does
    not seem to be the case under certain crash scenarios. Kdump uses an IPI
    to stop the other CPUs in the event of a crash, but when any of the
    other CPUs are locked-up inside the NMI handler the CPU that sends the
    IPI will end up looping forever in the ICR check, effectively
    hard-locking the whole system.
    Quoting from Intel's "MultiProcessor Specification" (Version 1.4), B-3:
    "A local APIC unit indicates successful dispatch of an IPI by
    resetting the Delivery Status bit in the Interrupt Command
    Register (ICR). The operating system polls the delivery status
    bit after sending an INIT or STARTUP IPI until the command has
    been dispatched.
    A period of 20 microseconds should be sufficient for IPI dispatch
    to complete under normal operating conditions. If the IPI is not
    successfully dispatched, the operating system can abort the
    command. Alternatively, the operating system can retry the IPI by
    writing the lower 32-bit double word of the ICR. This “time-out”
    mechanism can be implemented through an external interrupt, if
    interrupts are enabled on the processor, or through execution of
    an instruction or time-stamp counter spin loop."
    Intel's documentation suggests the implementation of a time-out
    mechanism, which, by the way, is already being open-coded in some parts
    of the kernel that tinker with ICR.
    Create a apic_wait_icr_idle replacement that implements the time-out
    mechanism and that can be used to solve the aforementioned problem.
    AK: moved both functions out of line
    AK: added improved loop from Keith Owens
    Signed-off-by: Fernando Luis Vazquez Cao <[EMAIL PROTECTED]>
    Signed-off-by: Andi Kleen <[EMAIL PROTECTED]>
 arch/i386/kernel/apic.c |   22 ++++++++++++++++++++++
 include/asm-i386/apic.h |    9 +++------
 2 files changed, 25 insertions(+), 6 deletions(-)

diff --git a/arch/i386/kernel/apic.c b/arch/i386/kernel/apic.c
index 93aa911..aca054c 100644
--- a/arch/i386/kernel/apic.c
+++ b/arch/i386/kernel/apic.c
@@ -129,6 +129,28 @@ static int modern_apic(void)
        return lapic_get_version() >= 0x14;
+void apic_wait_icr_idle(void)
+       while (apic_read(APIC_ICR) & APIC_ICR_BUSY)
+               cpu_relax();
+unsigned long safe_apic_wait_icr_idle(void)
+       unsigned long send_status;
+       int timeout;
+       timeout = 0;
+       do {
+               send_status = apic_read(APIC_ICR) & APIC_ICR_BUSY;
+               if (!send_status)
+                       break;
+               udelay(100);
+       } while (timeout++ < 1000);
+       return send_status;
  * enable_NMI_through_LVT0 - enable NMI through local vector table 0
diff --git a/include/asm-i386/apic.h b/include/asm-i386/apic.h
index a19810a..1e8f6f2 100644
--- a/include/asm-i386/apic.h
+++ b/include/asm-i386/apic.h
@@ -2,6 +2,7 @@
 #define __ASM_APIC_H
 #include <linux/pm.h>
+#include <linux/delay.h>
 #include <asm/fixmap.h>
 #include <asm/apicdef.h>
 #include <asm/processor.h>
@@ -64,12 +65,8 @@ static __inline fastcall unsigned long 
native_apic_read(unsigned long reg)
        return *((volatile unsigned long *)(APIC_BASE+reg));
-static __inline__ void apic_wait_icr_idle(void)
-       while ( apic_read( APIC_ICR ) & APIC_ICR_BUSY )
-               cpu_relax();
+void apic_wait_icr_idle(void);
+unsigned long safe_apic_wait_icr_idle(void);
 int get_physical_broadcast(void);
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at

Reply via email to