Hello!

Color me blind, but I don't see how the following race is avoided:

CPU 0:  A hardware interrupt is received for a threaded irq, which
        eventually results in do_hardirq() being invoked and the
        descriptor lock being acquired.  Because the IRQ_INPROGRESS
        status bit is set, execution continues.  Once the handler
        returns, having already cleared the IRQ_INPROGRESS status bit,
        the descriptor lock is released.

CPU 1:  A second hardware interrupt is received for the same threaded
        irq, which also wends its way to do_hardirq() with the
        IRQ_INPROGRESS status bit set.  It enters the handler (having
        released the descriptor lock) and accesses some data structure
        that CPU 2 now wants to get rid of.

CPU 2:  A synchronize_irq() is executed, again for this same irq.
        Because the descriptor status does not have the IRQ_NODELAY
        bit set, and because the IRQ_INPROGRESS status bit is set,
        this task blocks.

CPU 0:  Execution continues near the end of do_hardirq(), which notices
        that the descriptor wait_for_handler queue is non-empty,
        and therefore wakes up CPU 2's task.

CPU 2:  The task starts running, and proceeds to clean up the data
        structures that CPU 1 is still using.

CPU 1:  This second handler is suddenly and fatally disappointed by
        the disappearance of its data structures.


So what am I missing here?

                                                        Thanx, Paul
-
To unsubscribe from this list: send the line "unsubscribe linux-rt-users" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to