Messages in this thread | | | Date | Wed, 4 Nov 2015 06:48:36 -0500 | From | Jeff Layton <> | Subject | Re: timer code oops when calling mod_delayed_work |
| |
On Tue, 3 Nov 2015 19:06:58 -0500 Tejun Heo <tj@kernel.org> wrote:
> Hello, Jeff. > > Can you please verify whether the following patch fixes the issue? > > Thanks. > > diff --git a/kernel/time/timer.c b/kernel/time/timer.c > index 84190f0..566a282 100644 > --- a/kernel/time/timer.c > +++ b/kernel/time/timer.c > @@ -970,12 +970,21 @@ EXPORT_SYMBOL(add_timer); > */ > void add_timer_on(struct timer_list *timer, int cpu) > { > - struct tvec_base *base = per_cpu_ptr(&tvec_bases, cpu); > + struct tvec_base *new_base = per_cpu_ptr(&tvec_bases, cpu); > + struct tvec_base *base; > unsigned long flags; > > timer_stats_timer_set_start_info(timer); > BUG_ON(timer_pending(timer) || !timer->function); > - spin_lock_irqsave(&base->lock, flags); > + > + base = lock_timer_base(timer, &flags); > + if (base != new_base) { > + timer->flags |= TIMER_MIGRATING; > + spin_unlock(&base->lock); > + base = new_base; > + spin_lock(&base->lock); > + } > + > timer->flags = (timer->flags & ~TIMER_BASEMASK) | cpu; > debug_activate(timer, timer->expires); > internal_add_timer(base, timer);
Yes, thanks! That fixes my reproducer and Chris also said he was unable to reproduce the bug after applying that patch. You can add this if you like:
Tested-by: Jeff Layton <jlayton@poochiereds.net>
| |