On Mon, Jun 13, 2016 at 08:41:00AM -0000, Thomas Gleixner wrote:
> +static inline struct timer_base *get_timer_base(u32 tflags)
> +{
> +     return get_timer_cpu_base(tflags, tflags & TIMER_BASEMASK);
> +}

This should rather be (tflags & TIMER_CPUMASK) to avoid using
per_cpu_ptr() with the TIMER_MIGRATING bit set in the CPU index.

The one caller in this patch is okay, since it already checks that
TIMER_MIGRATING is clear:

>  static struct timer_base *lock_timer_base(struct timer_list *timer,
> -                                     unsigned long *flags)
> +                                       unsigned long *flags)
>       __acquires(timer->base->lock)
>  {
>       for (;;) {
> -             u32 tf = timer->flags;
>               struct timer_base *base;
> +             u32 tf = timer->flags;
>  
>               if (!(tf & TIMER_MIGRATING)) {
> -                     base = per_cpu_ptr(&timer_bases, tf & TIMER_CPUMASK);
> +                     base = get_timer_base(tf);

However, in patch #20, we'll have this in __mod_timer();

                /*
                 * Take the current timer_jiffies of base, but without holding
                 * the lock!
                 */
                base = get_timer_base(timer->flags);

Thanks,
Richard

Reply via email to