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

Commit 193c3cc1 authored by Russell King's avatar Russell King Committed by Russell King
Browse files

[ARM] Fix timer damage from d3d74453



Move the xtime write mode seqlock into timer_tick(), so it only
surrounds the call to do_timer().

This avoids a deadlock in update_process_times() ...
hrtimer_get_softirq_time() which tries to get a read mode seqlock
on xtime, thereby preventing booting.

Signed-off-by: default avatarRussell King <rmk+kernel@arm.linux.org.uk>
parent 6232be32
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -325,7 +325,9 @@ void timer_tick(void)
	profile_tick(CPU_PROFILING);
	do_leds();
	do_set_rtc();
	write_seqlock(&xtime_lock);
	do_timer(1);
	write_sequnlock(&xtime_lock);
#ifndef CONFIG_SMP
	update_process_times(user_mode(get_irq_regs()));
#endif
+0 −4
Original line number Diff line number Diff line
@@ -130,13 +130,9 @@ static irqreturn_t
aaec2000_timer_interrupt(int irq, void *dev_id)
{
	/* TODO: Check timer accuracy */
	write_seqlock(&xtime_lock);

	timer_tick();
	TIMER1_CLEAR = 1;

	write_sequnlock(&xtime_lock);

	return IRQ_HANDLED;
}

+0 −2
Original line number Diff line number Diff line
@@ -50,9 +50,7 @@ static unsigned long clps711x_gettimeoffset(void)
static irqreturn_t
p720t_timer_interrupt(int irq, void *dev_id)
{
	write_seqlock(&xtime_lock);
	timer_tick();
	write_sequnlock(&xtime_lock);
	return IRQ_HANDLED;
}

+0 −4
Original line number Diff line number Diff line
@@ -298,8 +298,6 @@ extern unsigned long ioc_timer_gettimeoffset(void);
static irqreturn_t
clps7500_timer_interrupt(int irq, void *dev_id)
{
	write_seqlock(&xtime_lock);

	timer_tick();

	/* Why not using do_leds interface?? */
@@ -313,8 +311,6 @@ clps7500_timer_interrupt(int irq, void *dev_id)
		}
	}

	write_sequnlock(&xtime_lock);

	return IRQ_HANDLED;
}

+0 −4
Original line number Diff line number Diff line
@@ -178,8 +178,6 @@ ebsa110_timer_interrupt(int irq, void *dev_id)
{
	u32 count;

	write_seqlock(&xtime_lock);

	/* latch and read timer 1 */
	__raw_writeb(0x40, PIT_CTRL);
	count = __raw_readb(PIT_T1);
@@ -192,8 +190,6 @@ ebsa110_timer_interrupt(int irq, void *dev_id)

	timer_tick();

	write_sequnlock(&xtime_lock);

	return IRQ_HANDLED;
}

Loading