Impact: minor bugfix The threshold handler on AMD (and soon on Intel) could be theoretically reentered by the hardware. This could lead to corrupted events because the machine check poll code assumes it is not reentered. Move the APIC ACK to the end of the interrupt handler to let the hardware avoid that. Signed-off-by: Andi Kleen <ak@linux.intel.com> Signed-off-by: H. Peter Anvin <hpa@zytor.com>
26 lines
613 B
C
26 lines
613 B
C
/* Common corrected MCE threshold handler code */
|
|
#include <linux/kernel.h>
|
|
#include <linux/interrupt.h>
|
|
#include <asm/mce.h>
|
|
#include <asm/irq_vectors.h>
|
|
#include <asm/idle.h>
|
|
|
|
static void default_threshold_interrupt(void)
|
|
{
|
|
printk(KERN_ERR "Unexpected threshold interrupt at vector %x\n",
|
|
THRESHOLD_APIC_VECTOR);
|
|
}
|
|
|
|
void (*mce_threshold_vector)(void) = default_threshold_interrupt;
|
|
|
|
asmlinkage void mce_threshold_interrupt(void)
|
|
{
|
|
exit_idle();
|
|
irq_enter();
|
|
inc_irq_stat(irq_threshold_count);
|
|
mce_threshold_vector();
|
|
irq_exit();
|
|
/* Ack only at the end to avoid potential reentry */
|
|
ack_APIC_irq();
|
|
}
|