diff options
author | Peter Zijlstra <a.p.zijlstra@chello.nl> | 2010-03-08 11:51:33 -0500 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2010-03-10 07:23:36 -0500 |
commit | cc7f00820b2f3be656569c41158d9323e425bcfe (patch) | |
tree | fed31f96ccf6f988b7e29ed1e607ea49716f02a3 /arch | |
parent | a562b1871f7f7d2f3a835c3c1e07fa58d473cfb7 (diff) |
perf, x86: Avoid double disable on throttle vs ioctl(PERF_IOC_DISABLE)
Calling ioctl(PERF_EVENT_IOC_DISABLE) on a thottled counter would result
in a double disable, cure this by using x86_pmu_{start,stop} for
throttle/unthrottle and teach x86_pmu_stop() to check ->active_mask.
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>
Diffstat (limited to 'arch')
-rw-r--r-- | arch/x86/kernel/cpu/perf_event_intel_ds.c | 5 |
1 files changed, 2 insertions, 3 deletions
diff --git a/arch/x86/kernel/cpu/perf_event_intel_ds.c b/arch/x86/kernel/cpu/perf_event_intel_ds.c index e7ac51770d4d..a7401e4167df 100644 --- a/arch/x86/kernel/cpu/perf_event_intel_ds.c +++ b/arch/x86/kernel/cpu/perf_event_intel_ds.c | |||
@@ -461,7 +461,6 @@ static int intel_pmu_pebs_fixup_ip(struct pt_regs *regs) | |||
461 | } | 461 | } |
462 | 462 | ||
463 | static int intel_pmu_save_and_restart(struct perf_event *event); | 463 | static int intel_pmu_save_and_restart(struct perf_event *event); |
464 | static void intel_pmu_disable_event(struct perf_event *event); | ||
465 | 464 | ||
466 | static void intel_pmu_drain_pebs_core(struct pt_regs *iregs) | 465 | static void intel_pmu_drain_pebs_core(struct pt_regs *iregs) |
467 | { | 466 | { |
@@ -528,7 +527,7 @@ static void intel_pmu_drain_pebs_core(struct pt_regs *iregs) | |||
528 | regs.flags &= ~PERF_EFLAGS_EXACT; | 527 | regs.flags &= ~PERF_EFLAGS_EXACT; |
529 | 528 | ||
530 | if (perf_event_overflow(event, 1, &data, ®s)) | 529 | if (perf_event_overflow(event, 1, &data, ®s)) |
531 | intel_pmu_disable_event(event); | 530 | x86_pmu_stop(event); |
532 | 531 | ||
533 | out: | 532 | out: |
534 | intel_pmu_pebs_enable_all(); | 533 | intel_pmu_pebs_enable_all(); |
@@ -603,7 +602,7 @@ static void intel_pmu_drain_pebs_nhm(struct pt_regs *iregs) | |||
603 | regs.flags &= ~PERF_EFLAGS_EXACT; | 602 | regs.flags &= ~PERF_EFLAGS_EXACT; |
604 | 603 | ||
605 | if (perf_event_overflow(event, 1, &data, ®s)) | 604 | if (perf_event_overflow(event, 1, &data, ®s)) |
606 | intel_pmu_disable_event(event); | 605 | x86_pmu_stop(event); |
607 | } | 606 | } |
608 | out: | 607 | out: |
609 | intel_pmu_pebs_enable_all(); | 608 | intel_pmu_pebs_enable_all(); |