[PATCH] powerpc: irq work racing with timer interrupt can result in timer interrupt hang
Benjamin Herrenschmidt
benh at kernel.crashing.org
Sun May 11 19:03:28 EST 2014
On Sun, 2014-05-11 at 14:13 +0530, Preeti U Murthy wrote:
>
> Isn't this patch required too?
>
> @@ -503,12 +503,13 @@ void __timer_interrupt(void)
> now = *next_tb - now;
> if (now <= DECREMENTER_MAX)
> set_dec((int)now);
> - /* We may have raced with new irq work */
> - if (test_irq_work_pending())
> - set_dec(1);
> __get_cpu_var(irq_stat).timer_irqs_others++;
> }
>
> + /* We may have raced with new irq work */
> + if (test_irq_work_pending())
> + set_dec(1);
> +
>
> The event_handler cannot be relied upon to call
> decrementer_set_next_event() all the time. This is in the case where
> there are no pending timers. In that case we need to have the check on
> irq work pending at the end of __timer_interrupt() no?
I don't think we need to move the test no. If there's a pending
irq_work, at that point, it will have done set_dec when being queued up.
So we only care about cases where we might change the decrementer.
If the event handler doesn't call decrementer_set_next_event() then
nothing will modify the decrementer and it will still trigger soon.
Cheers,
Ben.
More information about the Linuxppc-dev
mailing list