perf, x86: Fix double enable calls
authorPeter Zijlstra <a.p.zijlstra@chello.nl>
Sat, 6 Mar 2010 12:24:58 +0000 (13:24 +0100)
committerIngo Molnar <mingo@elte.hu>
Wed, 10 Mar 2010 12:22:35 +0000 (13:22 +0100)
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>
arch/x86/kernel/cpu/perf_event.c

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