i8253 locking.
There are still a few places where we play with the RTC directly, with no locking. This catches some of them.
arch/i386/kernel/apm.c +6 -1
@@ -1166,9 +1166,13 @@ static void get_time_diff(void)#endif } -static inline void reinit_timer (void ) +static void reinit_timer (void ) {#ifdef INIT_TIMER_AFTER_SUSPEND +unsigned long flags; +extern spinlock_t i8253_lock; + +spin_lock_irqsave (&i8253_lock, flags);/* set the clock to 100 Hz */ outb_p (0x34 ,PIT_MODE );/* binary, mode 2, LSB/MSB, ch 0 */ udelay (10 );
@@ -1176,6 +1180,7 @@ static inline void reinit_timer(void)udelay (10 );outb (LATCH >>8 ,PIT_CH0 );/* MSB */ udelay (10 ); +spin_unlock_irqrestore (&i8253_lock, flags);#endif }
arch/i386/kernel/i8259.c +5 -0
@@ -373,11 +373,16 @@ void __init init_ISA_irqs (void)static void setup_timer (void ) { +extern spinlock_t i8253_lock; +unsigned long flags; + +spin_lock_irqsave (&i8253_lock, flags);outb_p (0x34 ,PIT_MODE );/* binary, mode 2, LSB/MSB, ch 0 */ udelay (10 );outb_p (LATCH &0xff ,PIT_CH0 );/* LSB */ udelay (10 );outb (LATCH >>8 ,PIT_CH0 );/* MSB */ +spin_unlock_irqrestore (&i8253_lock, flags); }static int timer_resume (struct device *dev,u32 level)