irqchip/gic-v3: make the unmasking of pseudo-NMIs explicit when handling IRQs

`gic_arch_enable_irqs()` is only used when handling IRQs (which could
be pseudo-NMIs) and unmasking pseudo-NMIs.

The chain of `gic_pmr_mask_irqs()` and `gic_arch_enable_irqs()` for it
is slightly confusing without further explanation.

Remove `gic_arch_enable_irqs()` and instead do the whole pseudo-NMI
umasking in `gic_unmask_pnmis()`, making the operation explicit.

Signed-off-by: Ada Couprie Diaz <ada.coupriediaz@arm.com>
Signed-off-by: Vladimir Murzin <vladimir.murzin@arm.com>
Reviewed-by: Jinjie Ruan <ruanjinjie@huawei.com>
Reviewed-by: Marc Zyngier <maz@kernel.org>
Signed-off-by: Will Deacon <will@kernel.org>
This commit is contained in:
Ada Couprie Diaz 2026-07-27 17:34:16 +01:00 committed by Will Deacon
parent 0d774e0517
commit 067f029c64
4 changed files with 8 additions and 12 deletions

View File

@ -246,11 +246,7 @@ static inline void gic_pmr_mask_irqs(void)
WARN_ON_ONCE(true);
}
static inline void gic_arch_enable_irqs(void)
{
/* Should not get called. */
WARN_ON_ONCE(true);
}
static inline void gic_unmask_pnmis(void) {}
static inline bool gic_has_relaxed_pmr_sync(void)
{

View File

@ -178,9 +178,12 @@ static inline void gic_pmr_mask_irqs(void)
gic_write_pmr(GIC_PRIO_IRQOFF);
}
static inline void gic_arch_enable_irqs(void)
static inline void gic_unmask_pnmis(void)
{
asm volatile ("msr daifclr, #3" : : : "memory");
if (gic_prio_masking_enabled()) {
gic_pmr_mask_irqs();
asm volatile ("msr daifclr, #3" : : : "memory");
}
}
static inline bool gic_has_relaxed_pmr_sync(void)

View File

@ -32,7 +32,7 @@ static inline bool arch_irqentry_exit_need_resched(void)
/*
* DAIF.DA are cleared at the start of IRQ/FIQ handling, and when GIC
* priority masking is used the GIC irqchip driver will clear DAIF.IF
* using gic_arch_enable_irqs() for normal IRQs. If anything is set in
* in gic_unmask_pnmis() for normal IRQs. If anything is set in
* DAIF we must have handled an NMI, so skip preemption.
*/
if (system_uses_irq_prio_masking() && read_sysreg(daif))

View File

@ -867,10 +867,7 @@ static void __gic_handle_irq_from_irqson(struct pt_regs *regs)
nmi_exit();
}
if (gic_prio_masking_enabled()) {
gic_pmr_mask_irqs();
gic_arch_enable_irqs();
}
gic_unmask_pnmis();
if (!is_nmi)
__gic_handle_irq(irqnr, regs);