perf: Fix perf_event_do_pending() fallback callsite
authorPeter Zijlstra <a.p.zijlstra@chello.nl>
Mon, 18 Jan 2010 08:08:26 +0000 (09:08 +0100)
committerIngo Molnar <mingo@elte.hu>
Thu, 21 Jan 2010 12:40:39 +0000 (13:40 +0100)
Paul questioned the context in which we should call
perf_event_do_pending(). After looking at that I found that it should be
called from IRQ context these days, however the fallback call-site is
placed in softirq context. Ammend this by placing the callback in the IRQ
timer path.

Reported-by: Paul Mackerras <paulus@samba.org>
Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl>
LKML-Reference: <1263374859.4244.192.camel@laptop>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
kernel/timer.c

index 15533b7..c61a794 100644 (file)
@@ -1198,6 +1198,7 @@ void update_process_times(int user_tick)
        run_local_timers();
        rcu_check_callbacks(cpu, user_tick);
        printk_tick();
        run_local_timers();
        rcu_check_callbacks(cpu, user_tick);
        printk_tick();
+       perf_event_do_pending();
        scheduler_tick();
        run_posix_cpu_timers(p);
 }
        scheduler_tick();
        run_posix_cpu_timers(p);
 }
@@ -1209,8 +1210,6 @@ static void run_timer_softirq(struct softirq_action *h)
 {
        struct tvec_base *base = __get_cpu_var(tvec_bases);
 
 {
        struct tvec_base *base = __get_cpu_var(tvec_bases);
 
-       perf_event_do_pending();
-
        hrtimer_run_pending();
 
        if (time_after_eq(jiffies, base->timer_jiffies))
        hrtimer_run_pending();
 
        if (time_after_eq(jiffies, base->timer_jiffies))