Skip to content

Commit

Permalink
ARM: add basic support for on-demand backtrace of other CPUs
Browse files Browse the repository at this point in the history
As we now have generic infrastructure to support backtracing of other
CPUs in the system on lockups, we can start to implement this for ARM.
Initially, we add an IPI based implementation, as the GIC code needs
modification to support the generation of FIQ IPIs, and not all ARM
platforms have the ability to raise a FIQ in the non-secure world.

This provides us with a "best efforts" implementation in the absence
of FIQs.

Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
  • Loading branch information
Russell King committed Jul 17, 2015
1 parent 4d7489f commit 96f0e00
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 0 deletions.
5 changes: 5 additions & 0 deletions arch/arm/include/asm/irq.h
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,11 @@ extern void (*handle_arch_irq)(struct pt_regs *);
extern void set_handle_irq(void (*handle_irq)(struct pt_regs *));
#endif

#ifdef CONFIG_SMP
extern void arch_trigger_all_cpu_backtrace(bool);
#define arch_trigger_all_cpu_backtrace(x) arch_trigger_all_cpu_backtrace(x)
#endif

#endif

#endif
Expand Down
18 changes: 18 additions & 0 deletions arch/arm/kernel/smp.c
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
#include <linux/cpu.h>
#include <linux/seq_file.h>
#include <linux/irq.h>
#include <linux/nmi.h>
#include <linux/percpu.h>
#include <linux/clockchips.h>
#include <linux/completion.h>
Expand Down Expand Up @@ -72,6 +73,7 @@ enum ipi_msg_type {
IPI_CPU_STOP,
IPI_IRQ_WORK,
IPI_COMPLETION,
IPI_CPU_BACKTRACE = 15,
};

static DECLARE_COMPLETION(cpu_running);
Expand Down Expand Up @@ -630,6 +632,12 @@ void handle_IPI(int ipinr, struct pt_regs *regs)
irq_exit();
break;

case IPI_CPU_BACKTRACE:
irq_enter();
nmi_cpu_backtrace(regs);
irq_exit();
break;

default:
pr_crit("CPU%u: Unknown IPI message 0x%x\n",
cpu, ipinr);
Expand Down Expand Up @@ -724,3 +732,13 @@ static int __init register_cpufreq_notifier(void)
core_initcall(register_cpufreq_notifier);

#endif

static void raise_nmi(cpumask_t *mask)
{
smp_cross_call(mask, IPI_CPU_BACKTRACE);
}

void arch_trigger_all_cpu_backtrace(bool include_self)
{
nmi_trigger_all_cpu_backtrace(include_self, raise_nmi);
}

0 comments on commit 96f0e00

Please sign in to comment.