mirror of
https://github.com/torvalds/linux.git
synced 2026-09-24 06:24:02 +02:00
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:
parent
0d774e0517
commit
067f029c64
|
|
@ -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)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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))
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user