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

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

index 985493af704b5b035b6adfb470c7dec6159e2cb1..5ffa4bacdad38191fc4ab8fddf193945aac10b87 100644 (file)
 #include <asm/kvm_arm.h>
 #include <asm/sysreg.h>
 
-#define NR_IPI 7
-
 typedef struct {
        unsigned int __softirq_pending;
-       unsigned int ipi_irqs[NR_IPI];
 } ____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)
-
-u64 smp_irq_stat_cpu(unsigned int cpu);
-#define arch_irq_stat_cpu      smp_irq_stat_cpu
-
 #define __ARCH_IRQ_EXIT_IRQS_DISABLED  1
 
 struct nmi_ctx {
index c298ad02252e3d58b7930e982fc4afab74dee044..2e7f529ec5a6559138137ee5b5143a70b0702965 100644 (file)
@@ -55,11 +55,6 @@ static inline void set_cpu_logical_map(int cpu, u64 hwid)
 
 struct seq_file;
 
-/*
- * generate IPI list text
- */
-extern void show_ipi_list(struct seq_file *p, int prec);
-
 /*
  * Discover the set of possible CPUs and determine their
  * SMP operations.
index 04a327ccf84da11d32cb1a46814b16b97e0306dd..9cf2fb87584aed83d64c1c38468c1dd9ea8a2e67 100644 (file)
  * Copyright (C) 2012 ARM Ltd.
  */
 
-#include <linux/kernel_stat.h>
 #include <linux/irq.h>
 #include <linux/memory.h>
 #include <linux/smp.h>
+#include <linux/hardirq.h>
 #include <linux/init.h>
 #include <linux/irqchip.h>
 #include <linux/kprobes.h>
 #include <asm/daifflags.h>
 #include <asm/vmap_stack.h>
 
-unsigned long irq_err_count;
-
 /* Only access this in an NMI enter/exit */
 DEFINE_PER_CPU(struct nmi_ctx, nmi_contexts);
 
 DEFINE_PER_CPU(unsigned long *, irq_stack_ptr);
 
-int arch_show_interrupts(struct seq_file *p, int prec)
-{
-       show_ipi_list(p, prec);
-       seq_printf(p, "%*s: %10lu\n", prec, "Err", irq_err_count);
-       return 0;
-}
-
 #ifdef CONFIG_VMAP_STACK
 static void init_irq_stacks(void)
 {
index 58fb155fb0ab363d516d2b27caf50168ed723baa..b6bde2675cccc6a1c6d7a9514a2dbab2689ec091 100644 (file)
@@ -30,6 +30,7 @@
 #include <linux/completion.h>
 #include <linux/of.h>
 #include <linux/irq_work.h>
+#include <linux/kernel_stat.h>
 #include <linux/kexec.h>
 #include <linux/kvm_host.h>
 
@@ -72,7 +73,8 @@ enum ipi_msg_type {
        IPI_CPU_CRASH_STOP,
        IPI_TIMER,
        IPI_IRQ_WORK,
-       IPI_WAKEUP
+       IPI_WAKEUP,
+       NR_IPI
 };
 
 static int ipi_irq_base __read_mostly;
@@ -795,29 +797,23 @@ static const char *ipi_types[NR_IPI] __tracepoint_string = {
 
 static void smp_cross_call(const struct cpumask *target, unsigned int ipinr);
 
-void show_ipi_list(struct seq_file *p, int prec)
+unsigned long irq_err_count;
+
+int arch_show_interrupts(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:%s", prec - 1, "IPI", i,
                           prec >= 4 ? " " : "");
                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;
+       seq_printf(p, "%*s: %10lu\n", prec, "Err", irq_err_count);
+       return 0;
 }
 
 void arch_send_call_function_ipi_mask(const struct cpumask *mask)
@@ -892,10 +888,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_RESCHEDULE:
@@ -992,7 +986,7 @@ void __init set_smp_ipi_range(int ipi_base, int n)
                int err;
 
                err = request_percpu_irq(ipi_base + i, ipi_handler,
-                                        "IPI", &irq_stat);
+                                        "IPI", &cpu_number);
                WARN_ON(err);
 
                ipi_desc[i] = irq_to_desc(ipi_base + i);