• S
    x86: Remove local_irq_enable()/local_irq_disable() in fixup_irqs() · 5231a686
    Suresh Siddha 提交于
    To ensure that we handle all the pending interrupts (destined
    for this cpu that is going down) in the interrupt subsystem
    before the cpu goes offline, fixup_irqs() does:
    
    	local_irq_enable();
    	mdelay(1);
    	local_irq_disable();
    
    Enabling interrupts is not a good thing as this cpu is already
    offline. So this patch replaces that logic with,
    
    	mdelay(1);
    	check APIC_IRR bits
    	Retrigger the irq at the new destination if any interrupt has arrived
    	via IPI.
    
    For IO-APIC level triggered interrupts, this retrigger IPI will
    appear as an edge interrupt. ack_apic_level() will detect this
    condition and IO-APIC RTE's remoteIRR is cleared using directed
    EOI(using IO-APIC EOI register) on Intel platforms and for
    others it uses the existing mask+edge logic followed by
    unmask+level.
    
    We can also remove mdelay() and then send spuriuous interrupts
    to new cpu targets for all the irqs that were handled previously
    by this cpu that is going offline. While it works, I have seen
    spurious interrupt messages (nothing wrong but still annoying
    messages during cpu offline, which can be seen during
    suspend/resume etc)
    Signed-off-by: NSuresh Siddha <suresh.b.siddha@intel.com>
    Acked-by: NGary Hade <garyhade@us.ibm.com>
    Cc: Eric W. Biederman <ebiederm@xmission.com>
    LKML-Reference: <20091026230002.043281924@sbs-t61.sc.intel.com>
    Signed-off-by: NIngo Molnar <mingo@elte.hu>
    5231a686
irq.c 9.1 KB