Commit 4466c7bf authored by Liao Chen's avatar Liao Chen
Browse files

arm64: Add CONFIG_IPI_AS_NMI to IPI as NMI feature

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



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

This patch adds CONFIG_IPI_AS_NMI to control the availability of
pseudo NMIs, which follows upstream commit 41ddf73f (arm64: Add
framework to turn IPI as NMI).

Signed-off-by: default avatarLiao Chen <liaochen4@huawei.com>
parent 61a1dd4f
Loading
Loading
Loading
Loading
+11 −1
Original line number Diff line number Diff line
@@ -2242,9 +2242,19 @@ config ARM64_DEBUG_PRIORITY_MASKING
	  If unsure, say N
endif # ARM64_PSEUDO_NMI

config IPI_AS_NMI
	bool "Support ipi triggerred as pseudo nmi"
	depends on ARM64_PSEUDO_NMI
	default n
	help
	  This adds support to trigger ipi as pseudo nmi, which allows to have an IPI
	  leveraged to invoke NMI functions on other CPUs. Current prospective users
	  are NMI backtrace and KGDB CPUs round-up whose support is added via future
	  patches.

config NON_NMI_IPI_BACKTRACE
	bool "Support non nmi ipi backtrace"
	depends on ARM64_PSEUDO_NMI
	depends on IPI_AS_NMI
	default n
	help
	  This adds support for non nmi ipi backtrace, which allows hungtask_monitor
+1 −1
Original line number Diff line number Diff line
@@ -6,7 +6,7 @@

#include <asm-generic/irq.h>

#ifdef CONFIG_SMP
#if defined(CONFIG_SMP) && defined(CONFIG_IPI_AS_NMI)
extern bool arch_trigger_cpumask_backtrace(const cpumask_t *mask,
					   int exclude_cpu);
#define arch_trigger_cpumask_backtrace arch_trigger_cpumask_backtrace
+2 −1
Original line number Diff line number Diff line
@@ -34,7 +34,7 @@ obj-y := debug-monitors.o entry.o irq.o fpsimd.o \
			   cpufeature.o alternative.o cacheinfo.o		\
			   smp.o smp_spin_table.o topology.o smccc-call.o	\
			   syscall.o proton-pack.o idreg-override.o idle.o	\
			   patching.o ipi_nmi.o
			   patching.o

obj-$(CONFIG_AARCH32_EL0)		+= binfmt_elf32.o sys32.o signal32.o			\
					   sys_compat.o
@@ -79,6 +79,7 @@ obj-y += vdso-wrap.o
obj-$(CONFIG_COMPAT_VDSO)		+= vdso32-wrap.o
obj-$(CONFIG_ARM64_ILP32)		+= vdso-ilp32/
obj-$(CONFIG_UNWIND_PATCH_PAC_INTO_SCS)	+= patch-scs.o
obj-$(CONFIG_IPI_AS_NMI)		+= ipi_nmi.o
CFLAGS_patch-scs.o			+= -mbranch-protection=none

# Force dependency (vdso*-wrap.S includes vdso.so through incbin)
+2 −0
Original line number Diff line number Diff line
@@ -358,6 +358,7 @@ int kgdb_arch_remove_breakpoint(struct kgdb_bkpt *bpt)
			*(u32 *)bpt->saved_instr);
}

#ifdef CONFIG_IPI_AS_NMI
void kgdb_roundup_cpus(void)
{
	struct cpumask mask;
@@ -374,3 +375,4 @@ void kgdb_roundup_cpus(void)

	arm64_send_nmi(&mask);
}
#endif
+6 −0
Original line number Diff line number Diff line
@@ -937,7 +937,9 @@ static void ipi_setup(int cpu)
	for (i = 0; i < nr_ipi; i++)
		enable_percpu_irq(ipi_irq_base + i, 0);

#ifdef CONFIG_IPI_AS_NMI
	dynamic_ipi_setup(cpu);
#endif
}

#ifdef CONFIG_HOTPLUG_CPU
@@ -951,7 +953,9 @@ static void ipi_teardown(int cpu)
	for (i = 0; i < nr_ipi; i++)
		disable_percpu_irq(ipi_irq_base + i);

#ifdef CONFIG_IPI_AS_NMI
	dynamic_ipi_teardown(cpu);
#endif
}
#endif

@@ -973,8 +977,10 @@ void __init set_smp_ipi_range(int ipi_base, int n)
		irq_set_status_flags(ipi_base + i, IRQ_HIDDEN);
	}

#ifdef CONFIG_IPI_AS_NMI
	if (n > nr_ipi)
		set_smp_dynamic_ipi(ipi_base + nr_ipi);
#endif

	ipi_irq_base = ipi_base;

Loading