linux/arch/powerpc
Anton Blanchard 8050936caf powerpc: irq work racing with timer interrupt can result in timer interrupt hang
I am seeing an issue where a CPU running perf eventually hangs.
Traces show timer interrupts happening every 4 seconds even
when a userspace task is running on the CPU. /proc/timer_list
also shows pending hrtimers have not run in over an hour,
including the scheduler.

Looking closer, decrementers_next_tb is getting set to
0xffffffffffffffff, and at that point we will never take
a timer interrupt again.

In __timer_interrupt() we set decrementers_next_tb to
0xffffffffffffffff and rely on ->event_handler to update it:

        *next_tb = ~(u64)0;
        if (evt->event_handler)
                evt->event_handler(evt);

In this case ->event_handler is hrtimer_interrupt. This will eventually
call back through the clockevents code with the next event to be
programmed:

static int decrementer_set_next_event(unsigned long evt,
                                      struct clock_event_device *dev)
{
        /* Don't adjust the decrementer if some irq work is pending */
        if (test_irq_work_pending())
                return 0;
        __get_cpu_var(decrementers_next_tb) = get_tb_or_rtc() + evt;

If irq work came in between these two points, we will return
before updating decrementers_next_tb and we never process a timer
interrupt again.

This looks to have been introduced by 0215f7d8c5 (powerpc: Fix races
with irq_work). Fix it by removing the early exit and relying on
code later on in the function to force an early decrementer:

       /* We may have raced with new irq work */
       if (test_irq_work_pending())
               set_dec(1);

Signed-off-by: Anton Blanchard <anton@samba.org>
Cc: stable@vger.kernel.org # 3.14+
Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
2014-05-12 14:29:28 +10:00
..
boot powerpc: Bump BOOT_COMMAND_LINE_SIZE to 2048 2014-04-28 16:32:02 +10:00
configs Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs 2014-04-12 14:49:50 -07:00
crypto
include powerpc: Bump COMMAND_LINE_SIZE to 2048 2014-04-28 16:31:58 +10:00
kernel powerpc: irq work racing with timer interrupt can result in timer interrupt hang 2014-05-12 14:29:28 +10:00
kvm ppc/kvm: Clear the runlatch bit of a vcpu before napping 2014-04-28 16:32:49 +10:00
lib
math-emu powerpc: Correct emulated mtfsf instruction 2014-04-07 10:33:11 +10:00
mm powerpc/mm: Fix tlbie to add AVAL fields for 64K pages 2014-04-28 13:11:24 +10:00
net
oprofile
perf powerpc/perf/hv-24x7: Catalog version number is be64, not be32 2014-04-28 16:31:50 +10:00
platforms powerpc/powernv: Reset root port in firmware 2014-05-12 10:33:08 +10:00
sysdev powerpc/4xx: Fix section mismatch in ppc4xx_pci.c 2014-04-28 16:32:53 +10:00
xmon
Kconfig Merge git://git.infradead.org/users/eparis/audit 2014-04-12 12:38:53 -07:00
Kconfig.debug
Makefile powerpc/le: Avoid creatng R_PPC64_TOCSAVE relocations for modules. 2014-04-09 12:53:44 +10:00
relocs_check.pl