Powerpc/perf: Wire up PMI throttling
authorRavi Bangoria <ravi.bangoria@linux.ibm.com>
Wed, 21 Nov 2018 03:56:37 +0000 (09:26 +0530)
committerMichael Ellerman <mpe@ellerman.id.au>
Fri, 21 Dec 2018 00:32:49 +0000 (11:32 +1100)
Commit 14c63f17b1fde ("perf: Drop sample rate when sampling is too
slow") introduced a way to throttle PMU interrupts if we're spending
too much time just processing those. Wire up powerpc PMI handler to
use this infrastructure.

We have throttling of the *rate* of interrupts, but this adds
throttling based on the *time taken* to process the interrupts.

Signed-off-by: Ravi Bangoria <ravi.bangoria@linux.ibm.com>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
arch/powerpc/perf/core-book3s.c

index 383cc3640ac6835b7f7fcca143a0565579d244c3..b0723002a3967f895d0799fa07a5f0a871c3889b 100644 (file)
@@ -10,6 +10,7 @@
  */
 #include <linux/kernel.h>
 #include <linux/sched.h>
+#include <linux/sched/clock.h>
 #include <linux/perf_event.h>
 #include <linux/percpu.h>
 #include <linux/hardirq.h>
@@ -2166,7 +2167,7 @@ static bool pmc_overflow(unsigned long val)
 /*
  * Performance monitor interrupt stuff
  */
-static void perf_event_interrupt(struct pt_regs *regs)
+static void __perf_event_interrupt(struct pt_regs *regs)
 {
        int i, j;
        struct cpu_hw_events *cpuhw = this_cpu_ptr(&cpu_hw_events);
@@ -2250,6 +2251,14 @@ static void perf_event_interrupt(struct pt_regs *regs)
                irq_exit();
 }
 
+static void perf_event_interrupt(struct pt_regs *regs)
+{
+       u64 start_clock = sched_clock();
+
+       __perf_event_interrupt(regs);
+       perf_sample_event_took(sched_clock() - start_clock);
+}
+
 static int power_pmu_prepare_cpu(unsigned int cpu)
 {
        struct cpu_hw_events *cpuhw = &per_cpu(cpu_hw_events, cpu);