• Tejun Heo's avatar
    timer: Implement TIMER_IRQSAFE · c5f66e99
    Tejun Heo authored
    Timer internals are protected with irq-safe locks but timer execution
    isn't, so a timer being dequeued for execution and its execution
    aren't atomic against IRQs.  This makes it impossible to wait for its
    completion from IRQ handlers and difficult to shoot down a timer from
    IRQ handlers.
    
    This issue caused some issues for delayed_work interface.  Because
    there's no way to reliably shoot down delayed_work->timer from IRQ
    handlers, __cancel_delayed_work() can't share the logic to steal the
    target delayed_work with cancel_delayed_work_sync(), and can only
    steal delayed_works which are on queued on timer.  Similarly, the
    pending mod_delayed_work() can't be used from IRQ handlers.
    
    This patch adds a new timer flag TIMER_IRQSAFE, which makes the timer
    to be executed without enabling IRQ after dequeueing such that its
    dequeueing and execution are atomic against IRQ handlers.
    
    This makes it safe to wait for the timer's completion from IRQ
    handlers, for example, using del_timer_sync().  It can never be
    executing on the local CPU and if executing on other CPUs it won't be
    interrupted until done.
    
    This will enable simplifying delayed_work cancel/mod interface.
    Signed-off-by: default avatarTejun Heo <tj@kernel.org>
    Cc: torvalds@linux-foundation.org
    Cc: peterz@infradead.org
    Link: http://lkml.kernel.org/r/1344449428-24962-5-git-send-email-tj@kernel.orgSigned-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
    c5f66e99
timer.c 49.6 KB