Message ID | 20240626023316.539971-1-songshuaishuai@tinylab.org (mailing list archive) |
---|---|
State | Accepted |
Commit | c562ba719df570c986caf0941fea2449150bcbc4 |
Headers | show |
Series | [V2,-fixes] riscv: kexec: Avoid deadlock in kexec crash path | expand |
On Wed, 26 June 2024, Song Shuai wrote: >If the kexec crash code is called in the interrupt context, the >machine_kexec_mask_interrupts() function will trigger a deadlock while >trying to acquire the irqdesc spinlock and then deactivate irqchip in >irq_set_irqchip_state() function. > >Unlike arm64, riscv only requires irq_eoi handler to complete EOI and >keeping irq_set_irqchip_state() will only leave this possible deadlock >without any use. So we simply remove it. > >Link: https://lore.kernel.org/linux-riscv/20231208111015.173237-1-songshuaishuai@tinylab.org/ >Fixes: b17d19a5314a ("riscv: kexec: Fixup irq controller broken in kexec crash path") >Signed-off-by: Song Shuai <songshuaishuai@tinylab.org> >--- >Changes since V1: >https://lore.kernel.org/linux-riscv/20231208111015.173237-1-songshuaishuai@tinylab.org/ >- update the commit log as @Ryo elaborated >- rebase on Linux 6.10-rc3 Reviewed-by: Ryo Takakura <takakura@valinux.co.jp>
Hello: This patch was applied to riscv/linux.git (fixes) by Palmer Dabbelt <palmer@rivosinc.com>: On Wed, 26 Jun 2024 10:33:16 +0800 you wrote: > If the kexec crash code is called in the interrupt context, the > machine_kexec_mask_interrupts() function will trigger a deadlock while > trying to acquire the irqdesc spinlock and then deactivate irqchip in > irq_set_irqchip_state() function. > > Unlike arm64, riscv only requires irq_eoi handler to complete EOI and > keeping irq_set_irqchip_state() will only leave this possible deadlock > without any use. So we simply remove it. > > [...] Here is the summary with links: - [V2,-fixes] riscv: kexec: Avoid deadlock in kexec crash path https://git.kernel.org/riscv/c/c562ba719df5 You are awesome, thank you!
diff --git a/arch/riscv/kernel/machine_kexec.c b/arch/riscv/kernel/machine_kexec.c index ed9cad20c039..3c830a6f7ef4 100644 --- a/arch/riscv/kernel/machine_kexec.c +++ b/arch/riscv/kernel/machine_kexec.c @@ -121,20 +121,12 @@ static void machine_kexec_mask_interrupts(void) for_each_irq_desc(i, desc) { struct irq_chip *chip; - int ret; chip = irq_desc_get_chip(desc); if (!chip) continue; - /* - * First try to remove the active state. If this - * fails, try to EOI the interrupt. - */ - ret = irq_set_irqchip_state(i, IRQCHIP_STATE_ACTIVE, false); - - if (ret && irqd_irq_inprogress(&desc->irq_data) && - chip->irq_eoi) + if (chip->irq_eoi && irqd_irq_inprogress(&desc->irq_data)) chip->irq_eoi(&desc->irq_data); if (chip->irq_mask)
If the kexec crash code is called in the interrupt context, the machine_kexec_mask_interrupts() function will trigger a deadlock while trying to acquire the irqdesc spinlock and then deactivate irqchip in irq_set_irqchip_state() function. Unlike arm64, riscv only requires irq_eoi handler to complete EOI and keeping irq_set_irqchip_state() will only leave this possible deadlock without any use. So we simply remove it. Link: https://lore.kernel.org/linux-riscv/20231208111015.173237-1-songshuaishuai@tinylab.org/ Fixes: b17d19a5314a ("riscv: kexec: Fixup irq controller broken in kexec crash path") Signed-off-by: Song Shuai <songshuaishuai@tinylab.org> --- Changes since V1: https://lore.kernel.org/linux-riscv/20231208111015.173237-1-songshuaishuai@tinylab.org/ - update the commit log as @Ryo elaborated - rebase on Linux 6.10-rc3 --- arch/riscv/kernel/machine_kexec.c | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-)