• Peter Zijlstra's avatar
    perf: Fix mux_interval hrtimer wreckage · 272325c4
    Peter Zijlstra authored
    Thomas stumbled over the hrtimer_forward_now() in
    perf_event_mux_interval_ms_store() and noticed its broken-ness.
    
    You cannot just change the expiry time of an active timer, it will
    destroy the red-black tree order and cause havoc.
    
    Change it to (re)start the timer instead, (re)starting a timer will
    dequeue and enqueue a timer and therefore preserve rb-tree order.
    
    Since we cannot enqueue remotely, wrap the thing in
    cpu_function_call(), this however mandates that we restrict ourselves
    to online cpus. Also serialize the entire setting so we don't get
    multiple concurrent threads trying to update to different values.
    
    Also fix a problem in perf_mux_hrtimer_restart(), checking against
    hrtimer_active() can actually loose us the timer when timer->state ==
    HRTIMER_STATE_CALLBACK and the callback has already decided NORESTART.
    
    Furthermore it doesn't make any sense to test
    hrtimer_callback_running() when we already tested hrtimer_active(),
    but with the above change, we explicitly must call it when
    callback_running.
    
    Lastly, rename a few functions:
    
      s/perf_cpu_hrtimer_/perf_mux_hrtimer_/ -- because I could not find
                                                the mux timer function
    
      s/\<hr\>/timer/ -- because that's the normal way of calling things.
    
    Fixes: 62b85639 ("perf: Add sysfs entry to adjust multiplexing interval per PMU")
    Reported-by: default avatarThomas Gleixner <tglx@linutronix.de>
    Signed-off-by: default avatarPeter Zijlstra (Intel) <peterz@infradead.org>
    Link: http://lkml.kernel.org/r/20150415095011.863052571@infradead.orgSigned-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
    272325c4
core.c 210 KB