浏览代码

perf: Fix perf_event_do_pending() fallback callsite

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>
Peter Zijlstra 15 年之前
父节点
当前提交
fe432200ab
共有 1 个文件被更改,包括 1 次插入2 次删除
  1. 1 2
      kernel/timer.c

+ 1 - 2
kernel/timer.c

@@ -1198,6 +1198,7 @@ void update_process_times(int user_tick)
 	run_local_timers();
 	run_local_timers();
 	rcu_check_callbacks(cpu, user_tick);
 	rcu_check_callbacks(cpu, user_tick);
 	printk_tick();
 	printk_tick();
+	perf_event_do_pending();
 	scheduler_tick();
 	scheduler_tick();
 	run_posix_cpu_timers(p);
 	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();
 	hrtimer_run_pending();
 
 
 	if (time_after_eq(jiffies, base->timer_jiffies))
 	if (time_after_eq(jiffies, base->timer_jiffies))