瀏覽代碼

perf, x86: Fix double enable calls

hw_perf_enable() would enable already enabled events.

This causes problems with code that assumes that ->enable/->disable calls
are balanced (like the LBR code does).

What happens is that events that were already running and left in place
would get enabled again.

Avoid this by only enabling new events that match their previous
assignment.

Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Arnaldo Carvalho de Melo <acme@infradead.org>
Cc: paulus@samba.org
Cc: eranian@google.com
Cc: robert.richter@amd.com
Cc: fweisbec@gmail.com
LKML-Reference: <new-submission>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Peter Zijlstra 15 年之前
父節點
當前提交
f3d46b2e6f
共有 1 個文件被更改,包括 4 次插入0 次删除
  1. 4 0
      arch/x86/kernel/cpu/perf_event.c

+ 4 - 0
arch/x86/kernel/cpu/perf_event.c

@@ -835,6 +835,10 @@ void hw_perf_enable(void)
 			event = cpuc->event_list[i];
 			event = cpuc->event_list[i];
 			hwc = &event->hw;
 			hwc = &event->hw;
 
 
+			if (i < n_running &&
+			    match_prev_assignment(hwc, cpuc, i))
+				continue;
+
 			if (hwc->idx == -1)
 			if (hwc->idx == -1)
 				x86_assign_hw_event(event, cpuc, i);
 				x86_assign_hw_event(event, cpuc, i);