Commit 19925ce7 authored by Peter Zijlstra's avatar Peter Zijlstra Committed by Ingo Molnar

perf, x86: Fix double disable calls

hw_perf_enable() would disable events that were not yet enabled.

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

What happens is that we disable newly added counters that match their
previous assignment, even though they are not yet programmed on the
hardware.

Avoid this by only doing the first pass over the existing events.
Signed-off-by: default avatarPeter 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: default avatarIngo Molnar <mingo@elte.hu>
parent 356e1f2e
...@@ -802,6 +802,7 @@ void hw_perf_enable(void) ...@@ -802,6 +802,7 @@ void hw_perf_enable(void)
return; return;
if (cpuc->n_added) { if (cpuc->n_added) {
int n_running = cpuc->n_events - cpuc->n_added;
/* /*
* apply assignment obtained either from * apply assignment obtained either from
* hw_perf_group_sched_in() or x86_pmu_enable() * hw_perf_group_sched_in() or x86_pmu_enable()
...@@ -809,7 +810,7 @@ void hw_perf_enable(void) ...@@ -809,7 +810,7 @@ void hw_perf_enable(void)
* step1: save events moving to new counters * step1: save events moving to new counters
* step2: reprogram moved events into new counters * step2: reprogram moved events into new counters
*/ */
for (i = 0; i < cpuc->n_events; i++) { for (i = 0; i < n_running; i++) {
event = cpuc->event_list[i]; event = cpuc->event_list[i];
hwc = &event->hw; hwc = &event->hw;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment