| From 06a3f0c9f2725f5d7c63c4203839373c9bd00c28 Mon Sep 17 00:00:00 2001 |
| From: Justin Chen <justinpopo6@gmail.com> |
| Date: Wed, 27 Sep 2017 17:15:15 -0700 |
| Subject: MIPS: BMIPS: Do not mask IPIs during suspend |
| |
| From: Justin Chen <justinpopo6@gmail.com> |
| |
| commit 06a3f0c9f2725f5d7c63c4203839373c9bd00c28 upstream. |
| |
| Commit a3e6c1eff548 ("MIPS: IRQ: Fix disable_irq on CPU IRQs") fixes an |
| issue where disable_irq did not actually disable the irq. The bug caused |
| our IPIs to not be disabled, which actually is the correct behavior. |
| |
| With the addition of commit a3e6c1eff548 ("MIPS: IRQ: Fix disable_irq on |
| CPU IRQs"), the IPIs were getting disabled going into suspend, thus |
| schedule_ipi() was not being called. This caused deadlocks where |
| schedulable task were not being scheduled and other cpus were waiting |
| for them to do something. |
| |
| Add the IRQF_NO_SUSPEND flag so an irq_disable will not be called on the |
| IPIs during suspend. |
| |
| Signed-off-by: Justin Chen <justinpopo6@gmail.com> |
| Fixes: a3e6c1eff548 ("MIPS: IRQ: Fix disabled_irq on CPU IRQs") |
| Cc: Florian Fainelli <f.fainelli@gmail.com> |
| Cc: linux-mips@linux-mips.org |
| Cc: stable@vger.kernel.org |
| Patchwork: https://patchwork.linux-mips.org/patch/17385/ |
| [jhogan@kernel.org: checkpatch: wrap long lines and fix commit refs] |
| Signed-off-by: James Hogan <jhogan@kernel.org> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| arch/mips/kernel/smp-bmips.c | 8 ++++---- |
| 1 file changed, 4 insertions(+), 4 deletions(-) |
| |
| --- a/arch/mips/kernel/smp-bmips.c |
| +++ b/arch/mips/kernel/smp-bmips.c |
| @@ -168,11 +168,11 @@ static void bmips_prepare_cpus(unsigned |
| return; |
| } |
| |
| - if (request_irq(IPI0_IRQ, bmips_ipi_interrupt, IRQF_PERCPU, |
| - "smp_ipi0", NULL)) |
| + if (request_irq(IPI0_IRQ, bmips_ipi_interrupt, |
| + IRQF_PERCPU | IRQF_NO_SUSPEND, "smp_ipi0", NULL)) |
| panic("Can't request IPI0 interrupt"); |
| - if (request_irq(IPI1_IRQ, bmips_ipi_interrupt, IRQF_PERCPU, |
| - "smp_ipi1", NULL)) |
| + if (request_irq(IPI1_IRQ, bmips_ipi_interrupt, |
| + IRQF_PERCPU | IRQF_NO_SUSPEND, "smp_ipi1", NULL)) |
| panic("Can't request IPI1 interrupt"); |
| } |
| |