Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 4a88abd7 authored by Russell King's avatar Russell King
Browse files

ARM: SMP: provide individual IPI interrupt statistics



This separates out the individual IPI interrupt counts from the
total IPI count, which allows better visibility of what IPIs are
being used for.

Reviewed-by: default avatarCatalin Marinas <catalin.marinas@arm.com>
Signed-off-by: default avatarRussell King <rmk+kernel@arm.linux.org.uk>
parent f13cd417
Loading
Loading
Loading
Loading
+3 −1
Original line number Diff line number Diff line
@@ -5,13 +5,15 @@
#include <linux/threads.h>
#include <asm/irq.h>

#define NR_IPI	5

typedef struct {
	unsigned int __softirq_pending;
#ifdef CONFIG_LOCAL_TIMERS
	unsigned int local_timer_irqs;
#endif
#ifdef CONFIG_SMP
	unsigned int ipi_irqs;
	unsigned int ipi_irqs[NR_IPI];
#endif
} ____cacheline_aligned irq_cpustat_t;

+5 −0
Original line number Diff line number Diff line
@@ -62,6 +62,11 @@ int show_interrupts(struct seq_file *p, void *v)
	for (prec = 3, n = 1000; prec < 10 && n <= nr_irqs; prec++)
		n *= 10;

#ifdef CONFIG_SMP
	if (prec < 4)
		prec = 4;
#endif

	if (i == 0) {
		char cpuname[12];

+19 −6
Original line number Diff line number Diff line
@@ -382,16 +382,28 @@ void arch_send_call_function_single_ipi(int cpu)
	smp_cross_call(cpumask_of(cpu), IPI_CALL_FUNC_SINGLE);
}

static const char *ipi_types[NR_IPI] = {
#define S(x,s)	[x - IPI_TIMER] = s
	S(IPI_TIMER, "Timer broadcast interrupts"),
	S(IPI_RESCHEDULE, "Rescheduling interrupts"),
	S(IPI_CALL_FUNC, "Function call interrupts"),
	S(IPI_CALL_FUNC_SINGLE, "Single function call interrupts"),
	S(IPI_CPU_STOP, "CPU stop interrupts"),
};

void show_ipi_list(struct seq_file *p, int prec)
{
	unsigned int cpu;
	unsigned int cpu, i;

	seq_printf(p, "%*s: ", prec, "IPI");
	for (i = 0; i < NR_IPI; i++) {
		seq_printf(p, "%*s%u: ", prec - 1, "IPI", i);

		for_each_present_cpu(cpu)
		seq_printf(p, "%10u ", __get_irq_stat(cpu, ipi_irqs));
			seq_printf(p, "%10u ",
				   __get_irq_stat(cpu, ipi_irqs[i]));

	seq_printf(p, " Inter-processor interrupts\n");
		seq_printf(p, " %s\n", ipi_types[i]);
	}
}

/*
@@ -506,7 +518,8 @@ asmlinkage void __exception do_IPI(int ipinr, struct pt_regs *regs)
	unsigned int cpu = smp_processor_id();
	struct pt_regs *old_regs = set_irq_regs(regs);

	__inc_irq_stat(cpu, ipi_irqs);
	if (ipinr >= IPI_TIMER && ipinr < IPI_TIMER + NR_IPI)
		__inc_irq_stat(cpu, ipi_irqs[ipinr - IPI_TIMER]);

	switch (ipinr) {
	case IPI_TIMER: