On Saturday, 7 April 2007 11:49, Ingo Molnar wrote: > > find updated patch below - only the patch description changed: i removed > the 'UP' thing (patch has relevance on SMP too), and added Thomas' ack. > > Ingo > > ----------------------------> > Subject: [patch] high-res timers: resume fix > From: Ingo Molnar <[EMAIL PROTECTED]> > > Soeren Sonnenburg reported that upon resume he is getting > this backtrace: > > [<c0119637>] smp_apic_timer_interrupt+0x57/0x90 > [<c0142d30>] retrigger_next_event+0x0/0xb0 > [<c0104d30>] apic_timer_interrupt+0x28/0x30 > [<c0142d30>] retrigger_next_event+0x0/0xb0 > [<c0140068>] __kfifo_put+0x8/0x90 > [<c0130fe5>] on_each_cpu+0x35/0x60 > [<c0143538>] clock_was_set+0x18/0x20 > [<c0135cdc>] timekeeping_resume+0x7c/0xa0 > [<c02aabe1>] __sysdev_resume+0x11/0x80 > [<c02ab0c7>] sysdev_resume+0x47/0x80 > [<c02b0b05>] device_power_up+0x5/0x10 > > it turns out that on resume we mistakenly re-enable interrupts. > Do the timer retrigger only on the current CPU. > > Signed-off-by: Ingo Molnar <[EMAIL PROTECTED]> > Acked-by: Thomas Gleixner <[EMAIL PROTECTED]> > --- > include/linux/hrtimer.h | 3 +++ > kernel/hrtimer.c | 12 ++++++++++++ > 2 files changed, 15 insertions(+) > > Index: linux/include/linux/hrtimer.h > =================================================================== > --- linux.orig/include/linux/hrtimer.h > +++ linux/include/linux/hrtimer.h > @@ -206,6 +206,7 @@ struct hrtimer_cpu_base { > struct clock_event_device; > > extern void clock_was_set(void); > +extern void hres_timers_resume(void); > extern void hrtimer_interrupt(struct clock_event_device *dev); > > /* > @@ -236,6 +237,8 @@ static inline ktime_t hrtimer_cb_get_tim > */ > static inline void clock_was_set(void) { } > > +static inline void hres_timers_resume(void) { } > + > /* > * In non high resolution mode the time reference is taken from > * the base softirq time variable. > Index: linux/kernel/hrtimer.c > =================================================================== > --- linux.orig/kernel/hrtimer.c > +++ linux/kernel/hrtimer.c > @@ -459,6 +459,18 @@ void clock_was_set(void) > } > > /* > + * During resume we might have to reprogram the high resolution timer > + * interrupt (on the local CPU): > + */ > +void hres_timers_resume(void) > +{ > + WARN_ON_ONCE(num_online_cpus() > 1); > + > + /* Retrigger the CPU local events: */ > + retrigger_next_event(NULL); > +} > + > +/* > * Check, whether the timer is on the callback pending list > */ > static inline int hrtimer_cb_pending(const struct hrtimer *timer) > -
Hm, I'm probably missing something obvious, but where is it going to be called from? Rafael - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/