* [PATCH 1/3] arm64: Add pseudo NMI support of GICv3 SGIs
2019-05-06 8:25 [PATCH 0/3] arm64: Add support for on-demand backtrace by NMI-like IPI Wei Li
@ 2019-05-06 8:25 ` Wei Li
2019-05-13 8:26 ` Julien Thierry
2019-05-06 8:25 ` [PATCH 2/3] arm64: Add support for on-demand backtrace of other CPUs Wei Li
2019-05-06 8:25 ` [PATCH 3/3] arm64: Avoid entering NMI context improperly Wei Li
2 siblings, 1 reply; 5+ messages in thread
From: Wei Li @ 2019-05-06 8:25 UTC (permalink / raw)
To: catalin.marinas, will.deacon, marc.zyngier, tglx, jason
Cc: julien.thierry, Suzuki.Poulose, sudeep.holla, steve.capper,
lorenzo.pieralisi, daniel.thompson, james.morse,
linux-arm-kernel, linux-kernel
Currently, only PPIs and SPIs can be set as NMIs. IPIs being currently
hardcoded IRQ numbers, there isn't a generic interface to set SGIs as NMI
for now.
In this patch, we do:
1. Add an interface for setting priority of SGIs.
2. Export GICD_INT_NMI_PRI for setting priority of SGIs as NMI.
3. Move the gic_enable_nmi_support() earlier to make the gic_supports_nmi()
check works in gic_cpu_init().
Signed-off-by: Wei Li <liwei391@huawei.com>
Cc: Julien Thierry <julien.thierry@arm.com>
---
arch/arm64/include/asm/smp.h | 2 ++
arch/arm64/kernel/smp.c | 4 +++
drivers/irqchip/irq-gic-v3.c | 46 +++++++++++++++++++++-----
include/linux/irqchip/arm-gic-common.h | 1 +
include/linux/irqchip/arm-gic-v3.h | 1 +
5 files changed, 45 insertions(+), 9 deletions(-)
diff --git a/arch/arm64/include/asm/smp.h b/arch/arm64/include/asm/smp.h
index 18553f399e08..84d7ea073d84 100644
--- a/arch/arm64/include/asm/smp.h
+++ b/arch/arm64/include/asm/smp.h
@@ -158,6 +158,8 @@ bool cpus_are_stuck_in_kernel(void);
extern void crash_smp_send_stop(void);
extern bool smp_crash_stop_failed(void);
+extern void ipi_gic_nmi_setup(void __iomem *base);
+
#endif /* ifndef __ASSEMBLY__ */
#endif /* ifndef __ASM_SMP_H */
diff --git a/arch/arm64/kernel/smp.c b/arch/arm64/kernel/smp.c
index 824de7038967..bd8fdf6fcd8e 100644
--- a/arch/arm64/kernel/smp.c
+++ b/arch/arm64/kernel/smp.c
@@ -1067,3 +1067,7 @@ bool cpus_are_stuck_in_kernel(void)
return !!cpus_stuck_in_kernel || smp_spin_tables;
}
+
+void ipi_gic_nmi_setup(void __iomem *base)
+{
+}
diff --git a/drivers/irqchip/irq-gic-v3.c b/drivers/irqchip/irq-gic-v3.c
index 15e55d327505..394aa5668dd6 100644
--- a/drivers/irqchip/irq-gic-v3.c
+++ b/drivers/irqchip/irq-gic-v3.c
@@ -42,8 +42,6 @@
#include "irq-gic-common.h"
-#define GICD_INT_NMI_PRI (GICD_INT_DEF_PRI & ~0x80)
-
#define FLAGS_WORKAROUND_GICR_WAKER_MSM8996 (1ULL << 0)
struct redist_region {
@@ -324,6 +322,23 @@ static int gic_irq_get_irqchip_state(struct irq_data *d,
return 0;
}
+void gic_sgi_set_prio(void __iomem *base, u32 irqnr, u8 prio)
+{
+ u32 val, offset;
+
+ offset = GICR_IPRIORITYR0 + ((irqnr / 4) * 4);
+
+ /*
+ * Using writeb here may cause hardware error on some CPUs,
+ * aovid this quirk by using writel.
+ */
+ val = readl_relaxed(base + offset);
+ val &= ~(0xff << ((irqnr % 4) * 8));
+ val |= prio << ((irqnr % 4) * 8);
+
+ writel_relaxed(val, base + offset);
+}
+
static void gic_irq_set_prio(struct irq_data *d, u8 prio)
{
void __iomem *base = gic_dist_base(d);
@@ -474,6 +489,16 @@ static inline void gic_handle_nmi(u32 irqnr, struct pt_regs *regs)
{
int err;
+ if (unlikely(irqnr < 16)) {
+ gic_write_eoir(irqnr);
+ if (static_branch_likely(&supports_deactivate_key))
+ gic_write_dir(irqnr);
+#ifdef CONFIG_SMP
+ handle_IPI(irqnr, regs);
+#endif
+ return;
+ }
+
if (static_branch_likely(&supports_deactivate_key))
gic_write_eoir(irqnr);
/*
@@ -859,6 +884,9 @@ static void gic_cpu_init(void)
gic_cpu_config(rbase, gic_redist_wait_for_rwp);
+ if (gic_supports_nmi())
+ ipi_gic_nmi_setup(rbase);
+
/* initialise system registers */
gic_cpu_sys_reg_init();
}
@@ -1335,6 +1363,13 @@ static int __init gic_init_bases(void __iomem *dist_base,
gic_update_vlpi_properties();
+ if (gic_prio_masking_enabled()) {
+ if (!gic_has_group0() || gic_dist_security_disabled())
+ gic_enable_nmi_support();
+ else
+ pr_warn("SCR_EL3.FIQ is cleared, cannot enable use of pseudo-NMIs\n");
+ }
+
gic_smp_init();
gic_dist_init();
gic_cpu_init();
@@ -1345,13 +1380,6 @@ static int __init gic_init_bases(void __iomem *dist_base,
its_cpu_init();
}
- if (gic_prio_masking_enabled()) {
- if (!gic_has_group0() || gic_dist_security_disabled())
- gic_enable_nmi_support();
- else
- pr_warn("SCR_EL3.FIQ is cleared, cannot enable use of pseudo-NMIs\n");
- }
-
return 0;
out_free:
diff --git a/include/linux/irqchip/arm-gic-common.h b/include/linux/irqchip/arm-gic-common.h
index 9a1a479a2bf4..d8c973295179 100644
--- a/include/linux/irqchip/arm-gic-common.h
+++ b/include/linux/irqchip/arm-gic-common.h
@@ -18,6 +18,7 @@
(GICD_INT_DEF_PRI << 16) |\
(GICD_INT_DEF_PRI << 8) |\
GICD_INT_DEF_PRI)
+#define GICD_INT_NMI_PRI (GICD_INT_DEF_PRI & ~0x80)
enum gic_type {
GIC_V2,
diff --git a/include/linux/irqchip/arm-gic-v3.h b/include/linux/irqchip/arm-gic-v3.h
index c848a7cc502e..dc1c418229e7 100644
--- a/include/linux/irqchip/arm-gic-v3.h
+++ b/include/linux/irqchip/arm-gic-v3.h
@@ -606,6 +606,7 @@ int its_cpu_init(void);
int its_init(struct fwnode_handle *handle, struct rdists *rdists,
struct irq_domain *domain);
int mbi_init(struct fwnode_handle *fwnode, struct irq_domain *parent);
+void gic_sgi_set_prio(void __iomem *base, u32 irqnr, u8 prio);
static inline bool gic_enable_sre(void)
{
--
2.17.1
^ permalink raw reply [flat|nested] 5+ messages in thread* Re: [PATCH 1/3] arm64: Add pseudo NMI support of GICv3 SGIs
2019-05-06 8:25 ` [PATCH 1/3] arm64: Add pseudo NMI support of GICv3 SGIs Wei Li
@ 2019-05-13 8:26 ` Julien Thierry
0 siblings, 0 replies; 5+ messages in thread
From: Julien Thierry @ 2019-05-13 8:26 UTC (permalink / raw)
To: Wei Li, catalin.marinas, will.deacon, marc.zyngier, tglx, jason
Cc: Suzuki.Poulose, sudeep.holla, steve.capper, lorenzo.pieralisi,
daniel.thompson, james.morse, linux-arm-kernel, linux-kernel
Hi Wei,
On 06/05/2019 09:25, Wei Li wrote:
> Currently, only PPIs and SPIs can be set as NMIs. IPIs being currently
> hardcoded IRQ numbers, there isn't a generic interface to set SGIs as NMI
> for now.
>
> In this patch, we do:
> 1. Add an interface for setting priority of SGIs.
> 2. Export GICD_INT_NMI_PRI for setting priority of SGIs as NMI.
> 3. Move the gic_enable_nmi_support() earlier to make the gic_supports_nmi()
> check works in gic_cpu_init().
>
> Signed-off-by: Wei Li <liwei391@huawei.com>
> Cc: Julien Thierry <julien.thierry@arm.com>
> ---
> arch/arm64/include/asm/smp.h | 2 ++
> arch/arm64/kernel/smp.c | 4 +++
> drivers/irqchip/irq-gic-v3.c | 46 +++++++++++++++++++++-----
> include/linux/irqchip/arm-gic-common.h | 1 +
> include/linux/irqchip/arm-gic-v3.h | 1 +
> 5 files changed, 45 insertions(+), 9 deletions(-)
>
> diff --git a/arch/arm64/include/asm/smp.h b/arch/arm64/include/asm/smp.h
> index 18553f399e08..84d7ea073d84 100644
> --- a/arch/arm64/include/asm/smp.h
> +++ b/arch/arm64/include/asm/smp.h
> @@ -158,6 +158,8 @@ bool cpus_are_stuck_in_kernel(void);
> extern void crash_smp_send_stop(void);
> extern bool smp_crash_stop_failed(void);
>
> +extern void ipi_gic_nmi_setup(void __iomem *base);
> +
> #endif /* ifndef __ASSEMBLY__ */
>
> #endif /* ifndef __ASM_SMP_H */
> diff --git a/arch/arm64/kernel/smp.c b/arch/arm64/kernel/smp.c
> index 824de7038967..bd8fdf6fcd8e 100644
> --- a/arch/arm64/kernel/smp.c
> +++ b/arch/arm64/kernel/smp.c
> @@ -1067,3 +1067,7 @@ bool cpus_are_stuck_in_kernel(void)
>
> return !!cpus_stuck_in_kernel || smp_spin_tables;
> }
> +
> +void ipi_gic_nmi_setup(void __iomem *base)
> +{
> +}
> diff --git a/drivers/irqchip/irq-gic-v3.c b/drivers/irqchip/irq-gic-v3.c
> index 15e55d327505..394aa5668dd6 100644
> --- a/drivers/irqchip/irq-gic-v3.c
> +++ b/drivers/irqchip/irq-gic-v3.c
> @@ -42,8 +42,6 @@
>
> #include "irq-gic-common.h"
>
> -#define GICD_INT_NMI_PRI (GICD_INT_DEF_PRI & ~0x80)
> -
> #define FLAGS_WORKAROUND_GICR_WAKER_MSM8996 (1ULL << 0)
>
> struct redist_region {
> @@ -324,6 +322,23 @@ static int gic_irq_get_irqchip_state(struct irq_data *d,
> return 0;
> }
>
> +void gic_sgi_set_prio(void __iomem *base, u32 irqnr, u8 prio)
> +{
> + u32 val, offset;
> +
> + offset = GICR_IPRIORITYR0 + ((irqnr / 4) * 4);
> +
> + /*
> + * Using writeb here may cause hardware error on some CPUs,
> + * aovid this quirk by using writel.
> + */
> + val = readl_relaxed(base + offset);
> + val &= ~(0xff << ((irqnr % 4) * 8));
> + val |= prio << ((irqnr % 4) * 8);
> +
> + writel_relaxed(val, base + offset);
> +}
> +
> static void gic_irq_set_prio(struct irq_data *d, u8 prio)
> {
> void __iomem *base = gic_dist_base(d);
> @@ -474,6 +489,16 @@ static inline void gic_handle_nmi(u32 irqnr, struct pt_regs *regs)
> {
> int err;
>
> + if (unlikely(irqnr < 16)) {
> + gic_write_eoir(irqnr);
> + if (static_branch_likely(&supports_deactivate_key))
> + gic_write_dir(irqnr);
> +#ifdef CONFIG_SMP
> + handle_IPI(irqnr, regs);
> +#endif
> + return;
> + }
> +
> if (static_branch_likely(&supports_deactivate_key))
> gic_write_eoir(irqnr);
> /*
> @@ -859,6 +884,9 @@ static void gic_cpu_init(void)
>
> gic_cpu_config(rbase, gic_redist_wait_for_rwp);
>
> + if (gic_supports_nmi())
> + ipi_gic_nmi_setup(rbase);
> +
> /* initialise system registers */
> gic_cpu_sys_reg_init();
> }
> @@ -1335,6 +1363,13 @@ static int __init gic_init_bases(void __iomem *dist_base,
>
> gic_update_vlpi_properties();
>
> + if (gic_prio_masking_enabled()) {
> + if (!gic_has_group0() || gic_dist_security_disabled())
> + gic_enable_nmi_support();
> + else
> + pr_warn("SCR_EL3.FIQ is cleared, cannot enable use of pseudo-NMIs\n");
> + }
> +
> gic_smp_init();
> gic_dist_init();
> gic_cpu_init();
> @@ -1345,13 +1380,6 @@ static int __init gic_init_bases(void __iomem *dist_base,
> its_cpu_init();
> }
>
> - if (gic_prio_masking_enabled()) {
> - if (!gic_has_group0() || gic_dist_security_disabled())
> - gic_enable_nmi_support();
> - else
> - pr_warn("SCR_EL3.FIQ is cleared, cannot enable use of pseudo-NMIs\n");
> - }
> -
> return 0;
>
> out_free:
> diff --git a/include/linux/irqchip/arm-gic-common.h b/include/linux/irqchip/arm-gic-common.h
> index 9a1a479a2bf4..d8c973295179 100644
> --- a/include/linux/irqchip/arm-gic-common.h
> +++ b/include/linux/irqchip/arm-gic-common.h
> @@ -18,6 +18,7 @@
> (GICD_INT_DEF_PRI << 16) |\
> (GICD_INT_DEF_PRI << 8) |\
> GICD_INT_DEF_PRI)
> +#define GICD_INT_NMI_PRI (GICD_INT_DEF_PRI & ~0x80)
>
> enum gic_type {
> GIC_V2,
> diff --git a/include/linux/irqchip/arm-gic-v3.h b/include/linux/irqchip/arm-gic-v3.h
> index c848a7cc502e..dc1c418229e7 100644
> --- a/include/linux/irqchip/arm-gic-v3.h
> +++ b/include/linux/irqchip/arm-gic-v3.h
> @@ -606,6 +606,7 @@ int its_cpu_init(void);
> int its_init(struct fwnode_handle *handle, struct rdists *rdists,
> struct irq_domain *domain);
> int mbi_init(struct fwnode_handle *fwnode, struct irq_domain *parent);
> +void gic_sgi_set_prio(void __iomem *base, u32 irqnr, u8 prio);
This is a bit too generic to expose (even if it is not visible to modules):
- Callers of this function should have at least a way to check whether
the interrupt is enabled and, if it is, a way to disable it before
modifying its priority
- Even if the name contains "sgi", nothing is preventing from using this
to modify priority of PPIs and SPIs if irqnr >= 16.
- The caller can give any priority it wants when there are only two
priorities the GICv3 driver correctly handles correctly. Whatever gets
exposed outside of the driver should only allow to switch between those
two priorities.
A cleaner way to do what your series tries to achieve might be to have
arm64 IPI use the kernel IRQ allocation API so it can reuse what was
done for NMIs.
Thanks,
--
Julien Thierry
^ permalink raw reply [flat|nested] 5+ messages in thread
* [PATCH 2/3] arm64: Add support for on-demand backtrace of other CPUs
2019-05-06 8:25 [PATCH 0/3] arm64: Add support for on-demand backtrace by NMI-like IPI Wei Li
2019-05-06 8:25 ` [PATCH 1/3] arm64: Add pseudo NMI support of GICv3 SGIs Wei Li
@ 2019-05-06 8:25 ` Wei Li
2019-05-06 8:25 ` [PATCH 3/3] arm64: Avoid entering NMI context improperly Wei Li
2 siblings, 0 replies; 5+ messages in thread
From: Wei Li @ 2019-05-06 8:25 UTC (permalink / raw)
To: catalin.marinas, will.deacon, marc.zyngier, tglx, jason
Cc: julien.thierry, Suzuki.Poulose, sudeep.holla, steve.capper,
lorenzo.pieralisi, daniel.thompson, james.morse,
linux-arm-kernel, linux-kernel
To support backtracing of other CPUs in the system on lockups, add the
implementation of arch_trigger_cpumask_backtrace() for arm64.
In this patch, we add an arm64 NMI-like IPI based backtracer, referring
to the implementation on arm by Russell King and Chris Metcalf.
Signed-off-by: Wei Li <liwei391@huawei.com>
---
arch/arm64/include/asm/hardirq.h | 2 +-
arch/arm64/include/asm/irq.h | 6 ++++++
arch/arm64/kernel/smp.c | 22 +++++++++++++++++++++-
3 files changed, 28 insertions(+), 2 deletions(-)
diff --git a/arch/arm64/include/asm/hardirq.h b/arch/arm64/include/asm/hardirq.h
index 89691c86640a..a5d94aa59c7c 100644
--- a/arch/arm64/include/asm/hardirq.h
+++ b/arch/arm64/include/asm/hardirq.h
@@ -24,7 +24,7 @@
#include <asm/kvm_arm.h>
#include <asm/sysreg.h>
-#define NR_IPI 7
+#define NR_IPI 8
typedef struct {
unsigned int __softirq_pending;
diff --git a/arch/arm64/include/asm/irq.h b/arch/arm64/include/asm/irq.h
index b2b0c6405eb0..28471df488c0 100644
--- a/arch/arm64/include/asm/irq.h
+++ b/arch/arm64/include/asm/irq.h
@@ -13,5 +13,11 @@ static inline int nr_legacy_irqs(void)
return 0;
}
+#ifdef CONFIG_SMP
+extern void arch_trigger_cpumask_backtrace(const cpumask_t *mask,
+ bool exclude_self);
+#define arch_trigger_cpumask_backtrace arch_trigger_cpumask_backtrace
+#endif
+
#endif /* !__ASSEMBLER__ */
#endif
diff --git a/arch/arm64/kernel/smp.c b/arch/arm64/kernel/smp.c
index bd8fdf6fcd8e..7e862f9124f3 100644
--- a/arch/arm64/kernel/smp.c
+++ b/arch/arm64/kernel/smp.c
@@ -35,6 +35,7 @@
#include <linux/smp.h>
#include <linux/seq_file.h>
#include <linux/irq.h>
+#include <linux/nmi.h>
#include <linux/irqchip/arm-gic-v3.h>
#include <linux/percpu.h>
#include <linux/clockchips.h>
@@ -83,7 +84,8 @@ enum ipi_msg_type {
IPI_CPU_CRASH_STOP,
IPI_TIMER,
IPI_IRQ_WORK,
- IPI_WAKEUP
+ IPI_WAKEUP,
+ IPI_CPU_BACKTRACE
};
#ifdef CONFIG_HOTPLUG_CPU
@@ -787,6 +789,7 @@ static const char *ipi_types[NR_IPI] __tracepoint_string = {
S(IPI_TIMER, "Timer broadcast interrupts"),
S(IPI_IRQ_WORK, "IRQ work interrupts"),
S(IPI_WAKEUP, "CPU wake-up interrupts"),
+ S(IPI_CPU_BACKTRACE, "Backtrace interrupts"),
};
static void smp_cross_call(const struct cpumask *target, unsigned int ipinr)
@@ -946,6 +949,12 @@ void handle_IPI(int ipinr, struct pt_regs *regs)
break;
#endif
+ case IPI_CPU_BACKTRACE:
+ nmi_enter();
+ nmi_cpu_backtrace(regs);
+ nmi_exit();
+ break;
+
default:
pr_crit("CPU%u: Unknown IPI message 0x%x\n", cpu, ipinr);
break;
@@ -1070,4 +1079,15 @@ bool cpus_are_stuck_in_kernel(void)
void ipi_gic_nmi_setup(void __iomem *base)
{
+ gic_sgi_set_prio(base, IPI_CPU_BACKTRACE, GICD_INT_NMI_PRI);
+}
+
+static void raise_nmi(cpumask_t *mask)
+{
+ smp_cross_call(mask, IPI_CPU_BACKTRACE);
+}
+
+void arch_trigger_cpumask_backtrace(const cpumask_t *mask, bool exclude_self)
+{
+ nmi_trigger_cpumask_backtrace(mask, exclude_self, raise_nmi);
}
--
2.17.1
^ permalink raw reply [flat|nested] 5+ messages in thread* [PATCH 3/3] arm64: Avoid entering NMI context improperly
2019-05-06 8:25 [PATCH 0/3] arm64: Add support for on-demand backtrace by NMI-like IPI Wei Li
2019-05-06 8:25 ` [PATCH 1/3] arm64: Add pseudo NMI support of GICv3 SGIs Wei Li
2019-05-06 8:25 ` [PATCH 2/3] arm64: Add support for on-demand backtrace of other CPUs Wei Li
@ 2019-05-06 8:25 ` Wei Li
2 siblings, 0 replies; 5+ messages in thread
From: Wei Li @ 2019-05-06 8:25 UTC (permalink / raw)
To: catalin.marinas, will.deacon, marc.zyngier, tglx, jason
Cc: julien.thierry, Suzuki.Poulose, sudeep.holla, steve.capper,
lorenzo.pieralisi, daniel.thompson, james.morse,
linux-arm-kernel, linux-kernel
As the pseudo NMI can be enabled/disabled by cmdline parameter, the
arch_trigger_cpumask_backtrace() may still work through a normal IPI.
In this patch, we export the gic_supports_nmi() and add a check in
IPI_CPU_BACKTRACE process to avoid entering NMI context when pseudo
NMI is disabled.
Signed-off-by: Wei Li <liwei391@huawei.com>
---
arch/arm64/include/asm/arch_gicv3.h | 8 ++++++++
arch/arm64/kernel/smp.c | 14 ++++++++++++--
drivers/irqchip/irq-gic-v3.c | 8 +-------
3 files changed, 21 insertions(+), 9 deletions(-)
diff --git a/arch/arm64/include/asm/arch_gicv3.h b/arch/arm64/include/asm/arch_gicv3.h
index 14b41ddc68ba..6655701ea7d4 100644
--- a/arch/arm64/include/asm/arch_gicv3.h
+++ b/arch/arm64/include/asm/arch_gicv3.h
@@ -156,6 +156,14 @@ static inline u32 gic_read_rpr(void)
#define gits_write_vpendbaser(v, c) writeq_relaxed(v, c)
#define gits_read_vpendbaser(c) readq_relaxed(c)
+extern struct static_key_false supports_pseudo_nmis;
+
+static inline bool gic_supports_nmi(void)
+{
+ return IS_ENABLED(CONFIG_ARM64_PSEUDO_NMI) &&
+ static_branch_likely(&supports_pseudo_nmis);
+}
+
static inline bool gic_prio_masking_enabled(void)
{
return system_uses_irq_prio_masking();
diff --git a/arch/arm64/kernel/smp.c b/arch/arm64/kernel/smp.c
index 7e862f9124f3..5550951527ea 100644
--- a/arch/arm64/kernel/smp.c
+++ b/arch/arm64/kernel/smp.c
@@ -950,9 +950,19 @@ void handle_IPI(int ipinr, struct pt_regs *regs)
#endif
case IPI_CPU_BACKTRACE:
- nmi_enter();
+ if (gic_supports_nmi()) {
+ nmi_enter();
+ } else {
+ printk_nmi_enter();
+ irq_enter();
+ }
nmi_cpu_backtrace(regs);
- nmi_exit();
+ if (gic_supports_nmi()) {
+ nmi_exit();
+ } else {
+ irq_exit();
+ printk_nmi_exit();
+ }
break;
default:
diff --git a/drivers/irqchip/irq-gic-v3.c b/drivers/irqchip/irq-gic-v3.c
index 394aa5668dd6..b701727258b0 100644
--- a/drivers/irqchip/irq-gic-v3.c
+++ b/drivers/irqchip/irq-gic-v3.c
@@ -90,7 +90,7 @@ static DEFINE_STATIC_KEY_TRUE(supports_deactivate_key);
* For now, we only support pseudo-NMIs if we have non-secure view of
* priorities.
*/
-static DEFINE_STATIC_KEY_FALSE(supports_pseudo_nmis);
+DEFINE_STATIC_KEY_FALSE(supports_pseudo_nmis);
/* ppi_nmi_refs[n] == number of cpus having ppi[n + 16] set as NMI */
static refcount_t ppi_nmi_refs[16];
@@ -261,12 +261,6 @@ static void gic_unmask_irq(struct irq_data *d)
gic_poke_irq(d, GICD_ISENABLER);
}
-static inline bool gic_supports_nmi(void)
-{
- return IS_ENABLED(CONFIG_ARM64_PSEUDO_NMI) &&
- static_branch_likely(&supports_pseudo_nmis);
-}
-
static int gic_irq_set_irqchip_state(struct irq_data *d,
enum irqchip_irq_state which, bool val)
{
--
2.17.1
^ permalink raw reply [flat|nested] 5+ messages in thread