Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

powerpc: Make decrementer interrupt robust against offlined CPUs

With some implementations, it is possible that a timer interrupt
occurs every few seconds on an offline CPU. In this case, just
re-arm the decrementer and return immediately

Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>

+11 -4
+11 -4
arch/powerpc/kernel/time.c
··· 577 577 struct clock_event_device *evt = &decrementer->event; 578 578 u64 now; 579 579 580 + /* Ensure a positive value is written to the decrementer, or else 581 + * some CPUs will continue to take decrementer exceptions. 582 + */ 583 + set_dec(DECREMENTER_MAX); 584 + 585 + /* Some implementations of hotplug will get timer interrupts while 586 + * offline, just ignore these 587 + */ 588 + if (!cpu_online(smp_processor_id())) 589 + return; 590 + 580 591 trace_timer_interrupt_entry(regs); 581 592 582 593 __get_cpu_var(irq_stat).timer_irqs++; 583 - 584 - /* Ensure a positive value is written to the decrementer, or else 585 - * some CPUs will continuue to take decrementer exceptions */ 586 - set_dec(DECREMENTER_MAX); 587 594 588 595 #if defined(CONFIG_PPC32) && defined(CONFIG_PMAC) 589 596 if (atomic_read(&ppc_n_lost_interrupts) != 0)