ARM: Remove custom IRQ stat accounting
authorMarc Zyngier <maz@kernel.org>
Tue, 23 Jun 2020 20:15:00 +0000 (21:15 +0100)
committerMarc Zyngier <maz@kernel.org>
Thu, 17 Sep 2020 15:37:28 +0000 (16:37 +0100)
Let's switch the arm code to the core accounting, which already
does everything we need.

Reviewed-by: Valentin Schneider <valentin.schneider@arm.com>
Signed-off-by: Marc Zyngier <maz@kernel.org>
arch/arm/include/asm/hardirq.h
arch/arm/kernel/irq.c
arch/arm/kernel/smp.c

index 7a88f16..b95848e 100644 (file)
@@ -6,29 +6,12 @@
 #include <linux/threads.h>
 #include <asm/irq.h>
 
-/* number of IPIS _not_ including IPI_CPU_BACKTRACE */
-#define NR_IPI 7
-
 typedef struct {
        unsigned int __softirq_pending;
-#ifdef CONFIG_SMP
-       unsigned int ipi_irqs[NR_IPI];
-#endif
 } ____cacheline_aligned irq_cpustat_t;
 
 #include <linux/irq_cpustat.h> /* Standard mappings for irq_cpustat_t above */
 
-#define __inc_irq_stat(cpu, member)    __IRQ_STAT(cpu, member)++
-#define __get_irq_stat(cpu, member)    __IRQ_STAT(cpu, member)
-
-#ifdef CONFIG_SMP
-u64 smp_irq_stat_cpu(unsigned int cpu);
-#else
-#define smp_irq_stat_cpu(cpu)  0
-#endif
-
-#define arch_irq_stat_cpu      smp_irq_stat_cpu
-
 #define __ARCH_IRQ_EXIT_IRQS_DISABLED  1
 
 #endif /* __ASM_HARDIRQ_H */
index ee51403..698b6f6 100644 (file)
@@ -18,7 +18,6 @@
  *  IRQ's are in fact implemented a bit like signal handlers for the kernel.
  *  Naturally it's not a 1:1 relation, but there are similarities.
  */
-#include <linux/kernel_stat.h>
 #include <linux/signal.h>
 #include <linux/ioport.h>
 #include <linux/interrupt.h>
index d51e649..00327fa 100644 (file)
@@ -26,6 +26,7 @@
 #include <linux/completion.h>
 #include <linux/cpufreq.h>
 #include <linux/irq_work.h>
+#include <linux/kernel_stat.h>
 
 #include <linux/atomic.h>
 #include <asm/bugs.h>
@@ -65,6 +66,7 @@ enum ipi_msg_type {
        IPI_CPU_STOP,
        IPI_IRQ_WORK,
        IPI_COMPLETION,
+       NR_IPI,
        /*
         * CPU_BACKTRACE is special and not included in NR_IPI
         * or tracable with trace_ipi_*
@@ -529,27 +531,16 @@ void show_ipi_list(struct seq_file *p, int prec)
        unsigned int cpu, i;
 
        for (i = 0; i < NR_IPI; i++) {
+               unsigned int irq = irq_desc_get_irq(ipi_desc[i]);
                seq_printf(p, "%*s%u: ", prec - 1, "IPI", i);
 
                for_each_online_cpu(cpu)
-                       seq_printf(p, "%10u ",
-                                  __get_irq_stat(cpu, ipi_irqs[i]));
+                       seq_printf(p, "%10u ", kstat_irqs_cpu(irq, cpu));
 
                seq_printf(p, " %s\n", ipi_types[i]);
        }
 }
 
-u64 smp_irq_stat_cpu(unsigned int cpu)
-{
-       u64 sum = 0;
-       int i;
-
-       for (i = 0; i < NR_IPI; i++)
-               sum += __get_irq_stat(cpu, ipi_irqs[i]);
-
-       return sum;
-}
-
 void arch_send_call_function_ipi_mask(const struct cpumask *mask)
 {
        smp_cross_call(mask, IPI_CALL_FUNC);
@@ -630,10 +621,8 @@ static void do_handle_IPI(int ipinr)
 {
        unsigned int cpu = smp_processor_id();
 
-       if ((unsigned)ipinr < NR_IPI) {
+       if ((unsigned)ipinr < NR_IPI)
                trace_ipi_entry_rcuidle(ipi_types[ipinr]);
-               __inc_irq_stat(cpu, ipi_irqs[ipinr]);
-       }
 
        switch (ipinr) {
        case IPI_WAKEUP: