On 07/04/2012 02:21 AM, John Stultz wrote: > NOTE:This is a prerequisite patch that's required to > address the widely observed leap-second related futex/hrtimer > issues. > > Currently clock_was_set() is unsafe to be called from irq > context, as it calls on_each_cpu(). This causes problems when > we need to adjust the time from update_wall_time(). > > To fix this, if clock_was_set is called when irqs are > disabled, we schedule a timer to fire for immedately after > we're out of interrupt context to then notify the hrtimer > subsystem. > > CC: Prarit Bhargava <[email protected]> > CC: [email protected] > CC: Thomas Gleixner <[email protected]> > CC: [email protected] > Reported-by: Jan Engelhardt <[email protected]> > Signed-off-by: John Stultz <[email protected]> > --- > kernel/hrtimer.c | 17 ++++++++++++++++- > 1 file changed, 16 insertions(+), 1 deletion(-) > > diff --git a/kernel/hrtimer.c b/kernel/hrtimer.c > index ae34bf5..d730678 100644 > --- a/kernel/hrtimer.c > +++ b/kernel/hrtimer.c > @@ -746,7 +746,7 @@ static inline void retrigger_next_event(void *arg) { } > * resolution timer interrupts. On UP we just disable interrupts and > * call the high resolution interrupt code. > */ > -void clock_was_set(void) > +static void do_clock_was_set(unsigned long data) > { > #ifdef CONFIG_HIGH_RES_TIMERS > /* Retrigger the CPU local events everywhere */ > @@ -755,6 +755,21 @@ void clock_was_set(void) > timerfd_clock_was_set(); > } > > +static DEFINE_TIMER(clock_was_set_timer, do_clock_was_set , 0, 0); > + > +void clock_was_set(void) > +{ > + /* > + * We can't call on_each_cpu() from irq context, > + * so if irqs are disabled , schedule the clock_was_set > + * via a timer_list timer for right after. > + */ > + if (irqs_disabled())
I was wondering about this in earlier versions of the patchset. I thought it was supposed to be irqs_disabled. Thanks for changing this. Acked-by: Prarit Bhargava <[email protected]> P. -- To unsubscribe from this list: send the line "unsubscribe stable" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
