OSDN Git Service

powerpc/time: account broadcast timer event interrupts separately
authorNicholas Piggin <npiggin@gmail.com>
Fri, 4 May 2018 17:19:35 +0000 (03:19 +1000)
committerMichael Ellerman <mpe@ellerman.id.au>
Sun, 3 Jun 2018 10:40:29 +0000 (20:40 +1000)
These are not local timer interrupts but IPIs. It's good to be able
to see how timer offloading is behaving, so split these out into
their own category.

Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
arch/powerpc/include/asm/hardirq.h
arch/powerpc/kernel/irq.c
arch/powerpc/kernel/time.c

index 5986d47..20b0189 100644 (file)
@@ -8,6 +8,7 @@
 typedef struct {
        unsigned int __softirq_pending;
        unsigned int timer_irqs_event;
+       unsigned int broadcast_irqs_event;
        unsigned int timer_irqs_others;
        unsigned int pmu_irqs;
        unsigned int mce_exceptions;
index bbf7ec5..0682fef 100644 (file)
@@ -508,6 +508,11 @@ int arch_show_interrupts(struct seq_file *p, int prec)
                seq_printf(p, "%10u ", per_cpu(irq_stat, j).timer_irqs_event);
         seq_printf(p, "  Local timer interrupts for timer event device\n");
 
+       seq_printf(p, "%*s: ", prec, "BCT");
+       for_each_online_cpu(j)
+               seq_printf(p, "%10u ", per_cpu(irq_stat, j).broadcast_irqs_event);
+       seq_printf(p, "  Broadcast timer interrupts for timer event device\n");
+
        seq_printf(p, "%*s: ", prec, "LOC");
        for_each_online_cpu(j)
                seq_printf(p, "%10u ", per_cpu(irq_stat, j).timer_irqs_others);
@@ -567,6 +572,7 @@ u64 arch_irq_stat_cpu(unsigned int cpu)
 {
        u64 sum = per_cpu(irq_stat, cpu).timer_irqs_event;
 
+       sum += per_cpu(irq_stat, cpu).broadcast_irqs_event;
        sum += per_cpu(irq_stat, cpu).pmu_irqs;
        sum += per_cpu(irq_stat, cpu).mce_exceptions;
        sum += per_cpu(irq_stat, cpu).spurious_irqs;
index 23921f7..ed6b2ab 100644 (file)
@@ -647,13 +647,10 @@ EXPORT_SYMBOL(timer_interrupt);
 void timer_broadcast_interrupt(void)
 {
        u64 *next_tb = this_cpu_ptr(&decrementers_next_tb);
-       struct pt_regs *regs = get_irq_regs();
 
-       trace_timer_interrupt_entry(regs);
        *next_tb = ~(u64)0;
        tick_receive_broadcast();
-       __this_cpu_inc(irq_stat.timer_irqs_event);
-       trace_timer_interrupt_exit(regs);
+       __this_cpu_inc(irq_stat.broadcast_irqs_event);
 }
 #endif