Commit 6ab1c301 authored by Sumit Garg's avatar Sumit Garg Committed by Liao Chen
Browse files

arm64: ipi_nmi: Add support for NMI backtrace

maillist inclusion
category: feature
bugzilla: https://gitee.com/openeuler/kernel/issues/I8PLUM?from=project-issue
CVE: NA
Reference: https://lore.kernel.org/all/1604317487-14543-6-git-send-email-sumit.garg@linaro.org/



-------------------------------------------------

Enable NMI backtrace support on arm64 using IPI turned as an NMI
leveraging pseudo NMIs support. It is now possible for users to get a
backtrace of a CPU stuck in hard-lockup using magic SYSRQ.

Signed-off-by: default avatarSumit Garg <sumit.garg@linaro.org>
Signed-off-by: default avatarWei Li <liwei391@huawei.com>
Reviewed-by: default avatarXie XiuQi <xiexiuqi@huawei.com>
Signed-off-by: default avatarZheng Zengkai <zhengzengkai@huawei.com>
Signed-off-by: default avatarRuan Jinjie <ruanjinjie@huawei.com>
Signed-off-by: default avatarLiao Chen <liaochen4@huawei.com>
parent 491a30c1
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -6,6 +6,12 @@

#include <asm-generic/irq.h>

#ifdef CONFIG_SMP
extern bool arch_trigger_cpumask_backtrace(const cpumask_t *mask,
					   int exclude_cpu);
#define arch_trigger_cpumask_backtrace arch_trigger_cpumask_backtrace
#endif

struct pt_regs;

int set_handle_irq(void (*handle_irq)(struct pt_regs *));
+16 −2
Original line number Diff line number Diff line
@@ -8,6 +8,7 @@

#include <linux/interrupt.h>
#include <linux/irq.h>
#include <linux/nmi.h>
#include <linux/smp.h>

#include <asm/nmi.h>
@@ -31,11 +32,24 @@ void arm64_send_nmi(cpumask_t *mask)
	__ipi_send_mask(ipi_nmi_desc, mask);
}

bool arch_trigger_cpumask_backtrace(const cpumask_t *mask, int exclude_cpu)
{
	if (!ipi_nmi_desc)
		return false;

	nmi_trigger_cpumask_backtrace(mask, exclude_cpu, arm64_send_nmi);

	return true;
}

static irqreturn_t ipi_nmi_handler(int irq, void *data)
{
	/* nop, NMI handlers for special features can be added here. */
	irqreturn_t ret = IRQ_NONE;

	if (nmi_cpu_backtrace(get_irq_regs()))
		ret = IRQ_HANDLED;

	return IRQ_NONE;
	return ret;
}

void dynamic_ipi_setup(int cpu)