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

Configure Feed

Select the types of activity you want to include in your feed.

[PATCH] m32r: Fix local-timer event handling

There was a scheduling problem of the m32r SMP kernel; A process rarely
stopped and gave no responding but the other process have been handled by
the other CPU still lives, then if we did something in the other terminal
or something like that, the stopped process came back to life and continued
its operation... (ex. LMbench: lat_sig)

In the m32r SMP kernel, a local-timer event is delivered by using an
IPI(inter processor interrupts); LOCAL_TIMER_IPI. And a function
smp_send_timer() is prepared to send the LOCAL_TIMER_IPI from the current
CPU to the other CPUs.

The funtion smp_send_timer() was placed and used in do_IRQ() in
former times (before 2.6.10-rc3-mm1 kernel), however, it was
unintentionally removed when arch/m32r/kernel/irq.c was modified to
employ the generic hardirq framework (CONFIG_GENERIC_HARDIRQ) in
my previous patch.

[PATCH 2.6.10-rc3-mm1] m32r: Use generic hardirq framework
http://www.ussg.iu.edu/hypermail/linux/kernel/0412.2/0358.html

The following patch fixes the above problem.

Signed-off-by: Hitoshi Yamamoto <hitoshiy@isl.melco.co.jp>
Signed-off-by: Hirokazu Takata <takata@linux-m32r.org>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>

authored by

Hirokazu Takata and committed by
Linus Torvalds
2757a71c d2013485

+4 -9
+4 -9
arch/m32r/kernel/time.c
··· 205 205 * timer_interrupt() needs to keep up the real-time clock, 206 206 * as well as call the "do_timer()" routine every clocktick 207 207 */ 208 - static inline void 209 - do_timer_interrupt(int irq, void *dev_id, struct pt_regs * regs) 208 + irqreturn_t timer_interrupt(int irq, void *dev_id, struct pt_regs *regs) 210 209 { 211 210 #ifndef CONFIG_SMP 212 211 profile_tick(CPU_PROFILING, regs); ··· 220 221 * CMOS clock accordingly every ~11 minutes. Set_rtc_mmss() has to be 221 222 * called as close as possible to 500 ms before the new second starts. 222 223 */ 224 + write_seqlock(&xtime_lock); 223 225 if ((time_status & STA_UNSYNC) == 0 224 226 && xtime.tv_sec > last_rtc_update + 660 225 227 && (xtime.tv_nsec / 1000) >= 500000 - ((unsigned)TICK_SIZE) / 2 ··· 231 231 else /* do it again in 60 s */ 232 232 last_rtc_update = xtime.tv_sec - 600; 233 233 } 234 + write_sequnlock(&xtime_lock); 234 235 /* As we return to user mode fire off the other CPU schedulers.. 235 236 this is basically because we don't yet share IRQ's around. 236 237 This message is rigged to be safe on the 386 - basically it's ··· 239 238 240 239 #ifdef CONFIG_SMP 241 240 smp_local_timer_interrupt(regs); 241 + smp_send_timer(); 242 242 #endif 243 - } 244 - 245 - irqreturn_t timer_interrupt(int irq, void *dev_id, struct pt_regs *regs) 246 - { 247 - write_seqlock(&xtime_lock); 248 - do_timer_interrupt(irq, NULL, regs); 249 - write_sequnlock(&xtime_lock); 250 243 251 244 return IRQ_HANDLED; 252 245 }