Commit a2638815 authored by Marc Zyngier's avatar Marc Zyngier

arm64: Remove custom IRQ stat accounting

Let's switch the arm64 code to the core accounting, which already
does everything we need.
Reviewed-by: default avatarValentin Schneider <valentin.schneider@arm.com>
Acked-by: default avatarCatalin Marinas <catalin.marinas@arm.com>
Signed-off-by: default avatarMarc Zyngier <maz@kernel.org>
parent 5cebfd2d
...@@ -13,21 +13,12 @@ ...@@ -13,21 +13,12 @@
#include <asm/kvm_arm.h> #include <asm/kvm_arm.h>
#include <asm/sysreg.h> #include <asm/sysreg.h>
#define NR_IPI 7
typedef struct { typedef struct {
unsigned int __softirq_pending; unsigned int __softirq_pending;
unsigned int ipi_irqs[NR_IPI];
} ____cacheline_aligned irq_cpustat_t; } ____cacheline_aligned irq_cpustat_t;
#include <linux/irq_cpustat.h> /* Standard mappings for irq_cpustat_t above */ #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 #define __ARCH_IRQ_EXIT_IRQS_DISABLED 1
struct nmi_ctx { struct nmi_ctx {
......
...@@ -55,11 +55,6 @@ static inline void set_cpu_logical_map(int cpu, u64 hwid) ...@@ -55,11 +55,6 @@ static inline void set_cpu_logical_map(int cpu, u64 hwid)
struct seq_file; 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 * Discover the set of possible CPUs and determine their
* SMP operations. * SMP operations.
......
...@@ -10,10 +10,10 @@ ...@@ -10,10 +10,10 @@
* Copyright (C) 2012 ARM Ltd. * Copyright (C) 2012 ARM Ltd.
*/ */
#include <linux/kernel_stat.h>
#include <linux/irq.h> #include <linux/irq.h>
#include <linux/memory.h> #include <linux/memory.h>
#include <linux/smp.h> #include <linux/smp.h>
#include <linux/hardirq.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/irqchip.h> #include <linux/irqchip.h>
#include <linux/kprobes.h> #include <linux/kprobes.h>
...@@ -22,20 +22,11 @@ ...@@ -22,20 +22,11 @@
#include <asm/daifflags.h> #include <asm/daifflags.h>
#include <asm/vmap_stack.h> #include <asm/vmap_stack.h>
unsigned long irq_err_count;
/* Only access this in an NMI enter/exit */ /* Only access this in an NMI enter/exit */
DEFINE_PER_CPU(struct nmi_ctx, nmi_contexts); DEFINE_PER_CPU(struct nmi_ctx, nmi_contexts);
DEFINE_PER_CPU(unsigned long *, irq_stack_ptr); 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 #ifdef CONFIG_VMAP_STACK
static void init_irq_stacks(void) static void init_irq_stacks(void)
{ {
......
...@@ -30,6 +30,7 @@ ...@@ -30,6 +30,7 @@
#include <linux/completion.h> #include <linux/completion.h>
#include <linux/of.h> #include <linux/of.h>
#include <linux/irq_work.h> #include <linux/irq_work.h>
#include <linux/kernel_stat.h>
#include <linux/kexec.h> #include <linux/kexec.h>
#include <linux/kvm_host.h> #include <linux/kvm_host.h>
...@@ -72,7 +73,8 @@ enum ipi_msg_type { ...@@ -72,7 +73,8 @@ enum ipi_msg_type {
IPI_CPU_CRASH_STOP, IPI_CPU_CRASH_STOP,
IPI_TIMER, IPI_TIMER,
IPI_IRQ_WORK, IPI_IRQ_WORK,
IPI_WAKEUP IPI_WAKEUP,
NR_IPI
}; };
static int ipi_irq_base __read_mostly; static int ipi_irq_base __read_mostly;
...@@ -795,29 +797,23 @@ static const char *ipi_types[NR_IPI] __tracepoint_string = { ...@@ -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); 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; unsigned int cpu, i;
for (i = 0; i < NR_IPI; 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, seq_printf(p, "%*s%u:%s", prec - 1, "IPI", i,
prec >= 4 ? " " : ""); prec >= 4 ? " " : "");
for_each_online_cpu(cpu) for_each_online_cpu(cpu)
seq_printf(p, "%10u ", seq_printf(p, "%10u ", kstat_irqs_cpu(irq, cpu));
__get_irq_stat(cpu, ipi_irqs[i]));
seq_printf(p, " %s\n", ipi_types[i]); 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++) seq_printf(p, "%*s: %10lu\n", prec, "Err", irq_err_count);
sum += __get_irq_stat(cpu, ipi_irqs[i]); return 0;
return sum;
} }
void arch_send_call_function_ipi_mask(const struct cpumask *mask) void arch_send_call_function_ipi_mask(const struct cpumask *mask)
...@@ -892,10 +888,8 @@ static void do_handle_IPI(int ipinr) ...@@ -892,10 +888,8 @@ static void do_handle_IPI(int ipinr)
{ {
unsigned int cpu = smp_processor_id(); unsigned int cpu = smp_processor_id();
if ((unsigned)ipinr < NR_IPI) { if ((unsigned)ipinr < NR_IPI)
trace_ipi_entry_rcuidle(ipi_types[ipinr]); trace_ipi_entry_rcuidle(ipi_types[ipinr]);
__inc_irq_stat(cpu, ipi_irqs[ipinr]);
}
switch (ipinr) { switch (ipinr) {
case IPI_RESCHEDULE: case IPI_RESCHEDULE:
...@@ -992,7 +986,7 @@ void __init set_smp_ipi_range(int ipi_base, int n) ...@@ -992,7 +986,7 @@ void __init set_smp_ipi_range(int ipi_base, int n)
int err; int err;
err = request_percpu_irq(ipi_base + i, ipi_handler, err = request_percpu_irq(ipi_base + i, ipi_handler,
"IPI", &irq_stat); "IPI", &cpu_number);
WARN_ON(err); WARN_ON(err);
ipi_desc[i] = irq_to_desc(ipi_base + i); ipi_desc[i] = irq_to_desc(ipi_base + i);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment