Deadlock in ia64_mca_cmc_int_caller

From: Keith Owens <kaos_at_sgi.com>
Date: 2003-12-06 15:16:09
ia64_mca_cmc_int_caller() calls smp_call_function() which waits until
all cpus have taken the IPI before returning.  This interacts badly
with locks that are sometimes taken with interrupts disabled and
sometimes with interrupts enabled, smp_call_function can deadlock.

cpu 3                                                   cpu 0
Holds tasklist_lock with interrupts enabled,
it did read_lock() or write_lock().

                                                Does read_lock_irq() or
                                                write_lock_irq().  Spinning
                                                disabled waiting for tasklist_lock.

CMC interrupt occurs

ia64_mca_cmc_int_caller() calls smp_call_function()

smp_call_function() sends IPI to other cpus

                                                IPI on cpu 0 blocked, it is disabled
						waiting for tasklist_lock.

smp_call_function() waits until IPI reaches
all other cpus.

cpu 0 never responds, we never release the
tasklist lock, deadlock.

AFAICT it is never safe to call smp_call_function() from an interrupt
handler.

The unsafe nature of smp_call_function is not ia64 specific.  ix86 can
deadlock this way if any ix86 code calls smp_call_function from an
interrupt handler.

-
To unsubscribe from this list: send the line "unsubscribe linux-ia64" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Received on Fri Dec 5 23:16:46 2003

This archive was generated by hypermail 2.1.8 : 2005-08-02 09:20:20 EST