Skip to content
  • Li RongQing's avatar
    timer: Read jiffies once when forwarding base clk · e430d802
    Li RongQing authored
    The timer delayed for more than 3 seconds warning was triggered during
    testing.
    
      Workqueue: events_unbound sched_tick_remote
      RIP: 0010:sched_tick_remote+0xee/0x100
      ...
      Call Trace:
       process_one_work+0x18c/0x3a0
       worker_thread+0x30/0x380
       kthread+0x113/0x130
       ret_from_fork+0x22/0x40
    
    The reason is that the code in collect_expired_timers() uses jiffies
    unprotected:
    
        if (next_event > jiffies)
            base->clk = jiffies;
    
    As the compiler is allowed to reload the value base->clk can advance
    between the check and the store and in the worst case advance farther than
    next event. That causes the timer expiry to be delayed until the wheel
    pointer wraps around.
    
    Convert the code to use READ_ONCE()
    
    Fixes: 23696838
    
     ("timers: Optimize collect_expired_timers() for NOHZ")
    Signed-off-by: default avatarLi RongQing <lirongqing@baidu.com>
    Signed-off-by: default avatarLiang ZhiCheng <liangzhicheng@baidu.com>
    Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
    Cc: stable@vger.kern...
    e430d802