Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 963e5d3b authored by Benjamin Herrenschmidt's avatar Benjamin Herrenschmidt
Browse files

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: default avatarBenjamin Herrenschmidt <benh@kernel.crashing.org>
parent ecb78ab6
Loading
Loading
Loading
Loading
+11 −4
Original line number Original line Diff line number Diff line
@@ -577,14 +577,21 @@ void timer_interrupt(struct pt_regs * regs)
	struct clock_event_device *evt = &decrementer->event;
	struct clock_event_device *evt = &decrementer->event;
	u64 now;
	u64 now;


	/* Ensure a positive value is written to the decrementer, or else
	 * some CPUs will continue to take decrementer exceptions.
	 */
	set_dec(DECREMENTER_MAX);

	/* Some implementations of hotplug will get timer interrupts while
	 * offline, just ignore these
	 */
	if (!cpu_online(smp_processor_id()))
		return;

	trace_timer_interrupt_entry(regs);
	trace_timer_interrupt_entry(regs);


	__get_cpu_var(irq_stat).timer_irqs++;
	__get_cpu_var(irq_stat).timer_irqs++;


	/* Ensure a positive value is written to the decrementer, or else
	 * some CPUs will continuue to take decrementer exceptions */
	set_dec(DECREMENTER_MAX);

#if defined(CONFIG_PPC32) && defined(CONFIG_PMAC)
#if defined(CONFIG_PPC32) && defined(CONFIG_PMAC)
	if (atomic_read(&ppc_n_lost_interrupts) != 0)
	if (atomic_read(&ppc_n_lost_interrupts) != 0)
		do_IRQ(regs);
		do_IRQ(regs);