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: 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>
This commit is contained in:
parent
356e1f2e0a
commit
19925ce778
|
@ -802,6 +802,7 @@ void hw_perf_enable(void)
|
|||
return;
|
||||
|
||||
if (cpuc->n_added) {
|
||||
int n_running = cpuc->n_events - cpuc->n_added;
|
||||
/*
|
||||
* apply assignment obtained either from
|
||||
* hw_perf_group_sched_in() or x86_pmu_enable()
|
||||
|
@ -809,7 +810,7 @@ void hw_perf_enable(void)
|
|||
* step1: save events moving to 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];
|
||||
hwc = &event->hw;
|
||||
|
|
Loading…
Reference in New Issue