• Peter Zijlstra's avatar
    hrtimer: Allow concurrent hrtimer_start() for self restarting timers · ba4a679d
    Peter Zijlstra authored
    commit 5de2755c upstream.
    
    Because we drop cpu_base->lock around calling hrtimer::function, it is
    possible for hrtimer_start() to come in between and enqueue the timer.
    
    If hrtimer::function then returns HRTIMER_RESTART we'll hit the BUG_ON
    because HRTIMER_STATE_ENQUEUED will be set.
    
    Since the above is a perfectly valid scenario, remove the BUG_ON and
    make the enqueue_hrtimer() call conditional on the timer not being
    enqueued already.
    
    NOTE: in that concurrent scenario its entirely common for both sites
    to want to modify the hrtimer, since hrtimers don't provide
    serialization themselves be sure to provide some such that the
    hrtimer::function and the hrtimer_start() caller don't both try and
    fudge the expiration state at the same time.
    
    To that effect, add a WARN when someone tries to forward an already
    enqueued timer, the most common way to change the expiry of self
    restarting timers. Ideally we'd put the WARN in everything modifying
    the expiry but most of that is inlines and we don't need the bloat.
    
    Fixes: 2d44ae4d ("hrtimer: clean up cpu->base locking tricks")
    Signed-off-by: default avatarPeter Zijlstra (Intel) <peterz@infradead.org>
    Cc: Ben Segall <bsegall@google.com>
    Cc: Roman Gushchin <klamm@yandex-team.ru>
    Cc: Paul Turner <pjt@google.com>
    Link: http://lkml.kernel.org/r/20150415113105.GT5029@twins.programming.kicks-ass.netSigned-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
    [bwh: Backported to 3.2: adjust filename, context]
    Signed-off-by: default avatarBen Hutchings <ben@decadent.org.uk>
    ba4a679d
hrtimer.c 48.1 KB