|
@@ -205,8 +205,7 @@ static long last_rtc_update = 0;
|
|
* timer_interrupt() needs to keep up the real-time clock,
|
|
* timer_interrupt() needs to keep up the real-time clock,
|
|
* as well as call the "do_timer()" routine every clocktick
|
|
* as well as call the "do_timer()" routine every clocktick
|
|
*/
|
|
*/
|
|
-static inline void
|
|
|
|
-do_timer_interrupt(int irq, void *dev_id, struct pt_regs * regs)
|
|
|
|
|
|
+irqreturn_t timer_interrupt(int irq, void *dev_id, struct pt_regs *regs)
|
|
{
|
|
{
|
|
#ifndef CONFIG_SMP
|
|
#ifndef CONFIG_SMP
|
|
profile_tick(CPU_PROFILING, regs);
|
|
profile_tick(CPU_PROFILING, regs);
|
|
@@ -221,6 +220,7 @@ do_timer_interrupt(int irq, void *dev_id, struct pt_regs * regs)
|
|
* CMOS clock accordingly every ~11 minutes. Set_rtc_mmss() has to be
|
|
* CMOS clock accordingly every ~11 minutes. Set_rtc_mmss() has to be
|
|
* called as close as possible to 500 ms before the new second starts.
|
|
* called as close as possible to 500 ms before the new second starts.
|
|
*/
|
|
*/
|
|
|
|
+ write_seqlock(&xtime_lock);
|
|
if ((time_status & STA_UNSYNC) == 0
|
|
if ((time_status & STA_UNSYNC) == 0
|
|
&& xtime.tv_sec > last_rtc_update + 660
|
|
&& xtime.tv_sec > last_rtc_update + 660
|
|
&& (xtime.tv_nsec / 1000) >= 500000 - ((unsigned)TICK_SIZE) / 2
|
|
&& (xtime.tv_nsec / 1000) >= 500000 - ((unsigned)TICK_SIZE) / 2
|
|
@@ -231,6 +231,7 @@ do_timer_interrupt(int irq, void *dev_id, struct pt_regs * regs)
|
|
else /* do it again in 60 s */
|
|
else /* do it again in 60 s */
|
|
last_rtc_update = xtime.tv_sec - 600;
|
|
last_rtc_update = xtime.tv_sec - 600;
|
|
}
|
|
}
|
|
|
|
+ write_sequnlock(&xtime_lock);
|
|
/* As we return to user mode fire off the other CPU schedulers..
|
|
/* As we return to user mode fire off the other CPU schedulers..
|
|
this is basically because we don't yet share IRQ's around.
|
|
this is basically because we don't yet share IRQ's around.
|
|
This message is rigged to be safe on the 386 - basically it's
|
|
This message is rigged to be safe on the 386 - basically it's
|
|
@@ -238,14 +239,8 @@ do_timer_interrupt(int irq, void *dev_id, struct pt_regs * regs)
|
|
|
|
|
|
#ifdef CONFIG_SMP
|
|
#ifdef CONFIG_SMP
|
|
smp_local_timer_interrupt(regs);
|
|
smp_local_timer_interrupt(regs);
|
|
|
|
+ smp_send_timer();
|
|
#endif
|
|
#endif
|
|
-}
|
|
|
|
-
|
|
|
|
-irqreturn_t timer_interrupt(int irq, void *dev_id, struct pt_regs *regs)
|
|
|
|
-{
|
|
|
|
- write_seqlock(&xtime_lock);
|
|
|
|
- do_timer_interrupt(irq, NULL, regs);
|
|
|
|
- write_sequnlock(&xtime_lock);
|
|
|
|
|
|
|
|
return IRQ_HANDLED;
|
|
return IRQ_HANDLED;
|
|
}
|
|
}
|