• S
    x86: fix broken irq migration logic while cleaning up multiple vectors · 68a8ca59
    Suresh Siddha 提交于
    Impact: fix spurious IRQs
    
    During irq migration, we send a low priority interrupt to the previous
    irq destination. This happens in non interrupt-remapping case after interrupt
    starts arriving at new destination and in interrupt-remapping case after
    modifying and flushing the interrupt-remapping table entry caches.
    
    This low priority irq cleanup handler can cleanup multiple vectors, as
    multiple irq's can be migrated at almost the same time. While
    there will be multiple invocations of irq cleanup handler (one cleanup
    IPI for each irq migration), first invocation of the cleanup handler
    can potentially cleanup more than one vector (as the first invocation can
    see the requests for more than vector cleanup). When we cleanup multiple
    vectors during the first invocation of the smp_irq_move_cleanup_interrupt(),
    other vectors that are to be cleanedup can still be pending in the local
    cpu's IRR (as smp_irq_move_cleanup_interrupt() runs with interrupts disabled).
    
    When we are ready to unhook a vector corresponding to an irq, check if that
    vector is registered in the local cpu's IRR. If so skip that cleanup and
    do a self IPI with the cleanup vector, so that we give a chance to
    service the pending vector interrupt and then cleanup that vector
    allocation once we execute the lowest priority handler.
    
    This fixes spurious interrupts seen when migrating multiple vectors
    at the same time.
    
    [ This is apparently possible even on conventional xapic, although to
      the best of our knowledge it has never been seen.  The stable
      maintainers may wish to consider this one for -stable. ]
    Signed-off-by: NSuresh Siddha <suresh.b.siddha@intel.com>
    Cc: Eric W. Biederman <ebiederm@xmission.com>
    Signed-off-by: NH. Peter Anvin <hpa@linux.intel.com>
    Cc: stable@kernel.org
    68a8ca59
io_apic.c 98.2 KB