forked from luck/tmp_suning_uos_patched
perf_counter: x86: Fix throttling
If counters are disabled globally when a perfcounter IRQ/NMI hits, and if we throttle in that case, we'll promote the '0' value to the next lapic IRQ and disable all perfcounters at that point, permanently ... Fix it. [ Impact: fix hung perfcounters under load ] Acked-by: Peter Zijlstra <a.p.zijlstra@chello.nl> Cc: Paul Mackerras <paulus@samba.org> Cc: Corey Ashford <cjashfor@linux.vnet.ibm.com> LKML-Reference: <new-submission> Signed-off-by: Ingo Molnar <mingo@elte.hu>
This commit is contained in:
parent
ec3232bdf8
commit
f5a5a2f6e6
@ -765,8 +765,13 @@ static int intel_pmu_handle_irq(struct pt_regs *regs, int nmi)
|
||||
/*
|
||||
* Restore - do not reenable when global enable is off or throttled:
|
||||
*/
|
||||
if (++cpuc->interrupts < PERFMON_MAX_INTERRUPTS)
|
||||
intel_pmu_restore_all(cpuc->throttle_ctrl);
|
||||
if (cpuc->throttle_ctrl) {
|
||||
if (++cpuc->interrupts < PERFMON_MAX_INTERRUPTS) {
|
||||
intel_pmu_restore_all(cpuc->throttle_ctrl);
|
||||
} else {
|
||||
pr_info("CPU#%d: perfcounters: max interrupt rate exceeded! Throttle on.\n", smp_processor_id());
|
||||
}
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
@ -817,11 +822,16 @@ void perf_counter_unthrottle(void)
|
||||
|
||||
cpuc = &__get_cpu_var(cpu_hw_counters);
|
||||
if (cpuc->interrupts >= PERFMON_MAX_INTERRUPTS) {
|
||||
if (printk_ratelimit())
|
||||
printk(KERN_WARNING "perfcounters: max interrupts exceeded!\n");
|
||||
pr_info("CPU#%d: perfcounters: throttle off.\n", smp_processor_id());
|
||||
|
||||
/*
|
||||
* Clear them before re-enabling irqs/NMIs again:
|
||||
*/
|
||||
cpuc->interrupts = 0;
|
||||
hw_perf_restore(cpuc->throttle_ctrl);
|
||||
} else {
|
||||
cpuc->interrupts = 0;
|
||||
}
|
||||
cpuc->interrupts = 0;
|
||||
}
|
||||
|
||||
void smp_perf_counter_interrupt(struct pt_regs *regs)
|
||||
|
Loading…
Reference in New Issue
Block a user