diff mbox series

[SRU,bionic,4/5] powerpc/powernv: Fix opal_event_shutdown() called with interrupts disabled

Message ID 1536162512-22027-5-git-send-email-kamal@canonical.com
State New
Headers show
Series powerpc fixes (deadlock/snooze) | expand

Commit Message

Kamal Mostafa Sept. 5, 2018, 3:48 p.m. UTC
From: Nicholas Piggin <npiggin@gmail.com>

BugLink: http://bugs.launchpad.net/bugs/1790636

A kernel crash in process context that calls emergency_restart from
panic will end up calling opal_event_shutdown with interrupts disabled
but not in interrupt. This causes a sleeping function to be called
which gives the following warning with sysrq+c:

    Rebooting in 10 seconds..
    BUG: sleeping function called from invalid context at kernel/locking/mutex.c:238
    in_atomic(): 0, irqs_disabled(): 1, pid: 7669, name: bash
    CPU: 20 PID: 7669 Comm: bash Tainted: G      D W         4.17.0-rc5+ #3
    Call Trace:
    dump_stack+0xb0/0xf4 (unreliable)
    ___might_sleep+0x174/0x1a0
    mutex_lock+0x38/0xb0
    __free_irq+0x68/0x460
    free_irq+0x70/0xc0
    opal_event_shutdown+0xb4/0xf0
    opal_shutdown+0x24/0xa0
    pnv_shutdown+0x28/0x40
    machine_shutdown+0x44/0x60
    machine_restart+0x28/0x80
    emergency_restart+0x30/0x50
    panic+0x2a0/0x328
    oops_end+0x1ec/0x1f0
    bad_page_fault+0xe8/0x154
    handle_page_fault+0x34/0x38
    --- interrupt: 300 at sysrq_handle_crash+0x44/0x60
    LR = __handle_sysrq+0xfc/0x260
    flag_spec.62335+0x12b844/0x1e8db4 (unreliable)
    __handle_sysrq+0xfc/0x260
    write_sysrq_trigger+0xa8/0xb0
    proc_reg_write+0xac/0x110
    __vfs_write+0x6c/0x240
    vfs_write+0xd0/0x240
    ksys_write+0x6c/0x110

Fixes: 9f0fd0499d30 ("powerpc/powernv: Add a virtual irqchip for opal events")
Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Signed-off-by: Kamal Mostafa <kamal@canonical.com>
(cherry picked from commit 8bf84f005346fd0ecfa595c2d497b19a6e291b4e)
Signed-off-by: Kamal Mostafa <kamal@canonical.com>
---
 arch/powerpc/platforms/powernv/opal-irqchip.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

Comments

Colin Ian King Sept. 5, 2018, 4 p.m. UTC | #1
On 05/09/18 16:48, Kamal Mostafa wrote:
> From: Nicholas Piggin <npiggin@gmail.com>
> 
> BugLink: http://bugs.launchpad.net/bugs/1790636
> 
> A kernel crash in process context that calls emergency_restart from
> panic will end up calling opal_event_shutdown with interrupts disabled
> but not in interrupt. This causes a sleeping function to be called
> which gives the following warning with sysrq+c:
> 
>     Rebooting in 10 seconds..
>     BUG: sleeping function called from invalid context at kernel/locking/mutex.c:238
>     in_atomic(): 0, irqs_disabled(): 1, pid: 7669, name: bash
>     CPU: 20 PID: 7669 Comm: bash Tainted: G      D W         4.17.0-rc5+ #3
>     Call Trace:
>     dump_stack+0xb0/0xf4 (unreliable)
>     ___might_sleep+0x174/0x1a0
>     mutex_lock+0x38/0xb0
>     __free_irq+0x68/0x460
>     free_irq+0x70/0xc0
>     opal_event_shutdown+0xb4/0xf0
>     opal_shutdown+0x24/0xa0
>     pnv_shutdown+0x28/0x40
>     machine_shutdown+0x44/0x60
>     machine_restart+0x28/0x80
>     emergency_restart+0x30/0x50
>     panic+0x2a0/0x328
>     oops_end+0x1ec/0x1f0
>     bad_page_fault+0xe8/0x154
>     handle_page_fault+0x34/0x38
>     --- interrupt: 300 at sysrq_handle_crash+0x44/0x60
>     LR = __handle_sysrq+0xfc/0x260
>     flag_spec.62335+0x12b844/0x1e8db4 (unreliable)
>     __handle_sysrq+0xfc/0x260
>     write_sysrq_trigger+0xa8/0xb0
>     proc_reg_write+0xac/0x110
>     __vfs_write+0x6c/0x240
>     vfs_write+0xd0/0x240
>     ksys_write+0x6c/0x110
> 
> Fixes: 9f0fd0499d30 ("powerpc/powernv: Add a virtual irqchip for opal events")
> Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
> Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
> Signed-off-by: Kamal Mostafa <kamal@canonical.com>
> (cherry picked from commit 8bf84f005346fd0ecfa595c2d497b19a6e291b4e)
> Signed-off-by: Kamal Mostafa <kamal@canonical.com>


I can't find 8bf84f005346fd0ecfa595c2d497b19a6e291b4e in linux or
linux-next.  Where does it come from?


> ---
>  arch/powerpc/platforms/powernv/opal-irqchip.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/arch/powerpc/platforms/powernv/opal-irqchip.c b/arch/powerpc/platforms/powernv/opal-irqchip.c
> index 9d1b8c0..05ffe05 100644
> --- a/arch/powerpc/platforms/powernv/opal-irqchip.c
> +++ b/arch/powerpc/platforms/powernv/opal-irqchip.c
> @@ -177,7 +177,7 @@ void opal_event_shutdown(void)
>  		if (!opal_irqs[i])
>  			continue;
>  
> -		if (in_interrupt())
> +		if (in_interrupt() || irqs_disabled())
>  			disable_irq_nosync(opal_irqs[i]);
>  		else
>  			free_irq(opal_irqs[i], NULL);
>
Kamal Mostafa Sept. 5, 2018, 4:07 p.m. UTC | #2
On Wed, Sep 5, 2018 at 9:00 AM Colin Ian King <colin.king@canonical.com>
wrote:

> On 05/09/18 16:48, Kamal Mostafa wrote:
> > From: Nicholas Piggin <npiggin@gmail.com>
> >
> > BugLink: http://bugs.launchpad.net/bugs/1790636
> >
> > A kernel crash in process context that calls emergency_restart from
> > panic will end up calling opal_event_shutdown with interrupts disabled
> > but not in interrupt. This causes a sleeping function to be called
> > which gives the following warning with sysrq+c:
> >
> >     Rebooting in 10 seconds..
> >     BUG: sleeping function called from invalid context at
> kernel/locking/mutex.c:238
> >     in_atomic(): 0, irqs_disabled(): 1, pid: 7669, name: bash
> >     CPU: 20 PID: 7669 Comm: bash Tainted: G      D W         4.17.0-rc5+
> #3
> >     Call Trace:
> >     dump_stack+0xb0/0xf4 (unreliable)
> >     ___might_sleep+0x174/0x1a0
> >     mutex_lock+0x38/0xb0
> >     __free_irq+0x68/0x460
> >     free_irq+0x70/0xc0
> >     opal_event_shutdown+0xb4/0xf0
> >     opal_shutdown+0x24/0xa0
> >     pnv_shutdown+0x28/0x40
> >     machine_shutdown+0x44/0x60
> >     machine_restart+0x28/0x80
> >     emergency_restart+0x30/0x50
> >     panic+0x2a0/0x328
> >     oops_end+0x1ec/0x1f0
> >     bad_page_fault+0xe8/0x154
> >     handle_page_fault+0x34/0x38
> >     --- interrupt: 300 at sysrq_handle_crash+0x44/0x60
> >     LR = __handle_sysrq+0xfc/0x260
> >     flag_spec.62335+0x12b844/0x1e8db4 (unreliable)
> >     __handle_sysrq+0xfc/0x260
> >     write_sysrq_trigger+0xa8/0xb0
> >     proc_reg_write+0xac/0x110
> >     __vfs_write+0x6c/0x240
> >     vfs_write+0xd0/0x240
> >     ksys_write+0x6c/0x110
> >
> > Fixes: 9f0fd0499d30 ("powerpc/powernv: Add a virtual irqchip for opal
> events")
> > Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
> > Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
> > Signed-off-by: Kamal Mostafa <kamal@canonical.com>
> > (cherry picked from commit 8bf84f005346fd0ecfa595c2d497b19a6e291b4e)
> > Signed-off-by: Kamal Mostafa <kamal@canonical.com>
>
>
> I can't find 8bf84f005346fd0ecfa595c2d497b19a6e291b4e in linux or
> linux-next.  Where does it come from?
>
>
Ooops, that needs to be corrected, to:
(cherry picked from commit c0beffc4f4c658fde86d52c837e784326e9cc875)

 -Kamal


> > ---
> >  arch/powerpc/platforms/powernv/opal-irqchip.c | 2 +-
> >  1 file changed, 1 insertion(+), 1 deletion(-)
> >
> > diff --git a/arch/powerpc/platforms/powernv/opal-irqchip.c
> b/arch/powerpc/platforms/powernv/opal-irqchip.c
> > index 9d1b8c0..05ffe05 100644
> > --- a/arch/powerpc/platforms/powernv/opal-irqchip.c
> > +++ b/arch/powerpc/platforms/powernv/opal-irqchip.c
> > @@ -177,7 +177,7 @@ void opal_event_shutdown(void)
> >               if (!opal_irqs[i])
> >                       continue;
> >
> > -             if (in_interrupt())
> > +             if (in_interrupt() || irqs_disabled())
> >                       disable_irq_nosync(opal_irqs[i]);
> >               else
> >                       free_irq(opal_irqs[i], NULL);
> >
>
>
> --
> kernel-team mailing list
> kernel-team@lists.ubuntu.com
> https://lists.ubuntu.com/mailman/listinfo/kernel-team
>
<div dir="ltr"><div dir="ltr">On Wed, Sep 5, 2018 at 9:00 AM Colin Ian King &lt;<a href="mailto:colin.king@canonical.com">colin.king@canonical.com</a>&gt; wrote:<br></div><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">On 05/09/18 16:48, Kamal Mostafa wrote:<br>
&gt; From: Nicholas Piggin &lt;<a href="mailto:npiggin@gmail.com" target="_blank">npiggin@gmail.com</a>&gt;<br>
&gt; <br>
&gt; BugLink: <a href="http://bugs.launchpad.net/bugs/1790636" rel="noreferrer" target="_blank">http://bugs.launchpad.net/bugs/1790636</a><br>
&gt; <br>
&gt; A kernel crash in process context that calls emergency_restart from<br>
&gt; panic will end up calling opal_event_shutdown with interrupts disabled<br>
&gt; but not in interrupt. This causes a sleeping function to be called<br>
&gt; which gives the following warning with sysrq+c:<br>
&gt; <br>
&gt;     Rebooting in 10 seconds..<br>
&gt;     BUG: sleeping function called from invalid context at kernel/locking/mutex.c:238<br>
&gt;     in_atomic(): 0, irqs_disabled(): 1, pid: 7669, name: bash<br>
&gt;     CPU: 20 PID: 7669 Comm: bash Tainted: G      D W         4.17.0-rc5+ #3<br>
&gt;     Call Trace:<br>
&gt;     dump_stack+0xb0/0xf4 (unreliable)<br>
&gt;     ___might_sleep+0x174/0x1a0<br>
&gt;     mutex_lock+0x38/0xb0<br>
&gt;     __free_irq+0x68/0x460<br>
&gt;     free_irq+0x70/0xc0<br>
&gt;     opal_event_shutdown+0xb4/0xf0<br>
&gt;     opal_shutdown+0x24/0xa0<br>
&gt;     pnv_shutdown+0x28/0x40<br>
&gt;     machine_shutdown+0x44/0x60<br>
&gt;     machine_restart+0x28/0x80<br>
&gt;     emergency_restart+0x30/0x50<br>
&gt;     panic+0x2a0/0x328<br>
&gt;     oops_end+0x1ec/0x1f0<br>
&gt;     bad_page_fault+0xe8/0x154<br>
&gt;     handle_page_fault+0x34/0x38<br>
&gt;     --- interrupt: 300 at sysrq_handle_crash+0x44/0x60<br>
&gt;     LR = __handle_sysrq+0xfc/0x260<br>
&gt;     flag_spec.62335+0x12b844/0x1e8db4 (unreliable)<br>
&gt;     __handle_sysrq+0xfc/0x260<br>
&gt;     write_sysrq_trigger+0xa8/0xb0<br>
&gt;     proc_reg_write+0xac/0x110<br>
&gt;     __vfs_write+0x6c/0x240<br>
&gt;     vfs_write+0xd0/0x240<br>
&gt;     ksys_write+0x6c/0x110<br>
&gt; <br>
&gt; Fixes: 9f0fd0499d30 (&quot;powerpc/powernv: Add a virtual irqchip for opal events&quot;)<br>
&gt; Signed-off-by: Nicholas Piggin &lt;<a href="mailto:npiggin@gmail.com" target="_blank">npiggin@gmail.com</a>&gt;<br>
&gt; Signed-off-by: Michael Ellerman &lt;<a href="mailto:mpe@ellerman.id.au" target="_blank">mpe@ellerman.id.au</a>&gt;<br>
&gt; Signed-off-by: Kamal Mostafa &lt;<a href="mailto:kamal@canonical.com" target="_blank">kamal@canonical.com</a>&gt;<br>
&gt; (cherry picked from commit 8bf84f005346fd0ecfa595c2d497b19a6e291b4e)<br>
&gt; Signed-off-by: Kamal Mostafa &lt;<a href="mailto:kamal@canonical.com" target="_blank">kamal@canonical.com</a>&gt;<br>
<br>
<br>
I can&#39;t find 8bf84f005346fd0ecfa595c2d497b19a6e291b4e in linux or<br>
linux-next.  Where does it come from?<br>
<br></blockquote><div><br></div>Ooops, that needs to be corrected, to:<div><span style="font-size:medium;font-family:monospace">(cherry picked from commit </span><font face="monospace">c0beffc4f4c658fde86d52c837e784326e9cc875</font><span style="font-size:medium;font-family:monospace">)</span></div><div><br></div><div> -Kamal</div><div><br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<br>
&gt; ---<br>
&gt;  arch/powerpc/platforms/powernv/opal-irqchip.c | 2 +-<br>
&gt;  1 file changed, 1 insertion(+), 1 deletion(-)<br>
&gt; <br>
&gt; diff --git a/arch/powerpc/platforms/powernv/opal-irqchip.c b/arch/powerpc/platforms/powernv/opal-irqchip.c<br>
&gt; index 9d1b8c0..05ffe05 100644<br>
&gt; --- a/arch/powerpc/platforms/powernv/opal-irqchip.c<br>
&gt; +++ b/arch/powerpc/platforms/powernv/opal-irqchip.c<br>
&gt; @@ -177,7 +177,7 @@ void opal_event_shutdown(void)<br>
&gt;               if (!opal_irqs[i])<br>
&gt;                       continue;<br>
&gt;  <br>
&gt; -             if (in_interrupt())<br>
&gt; +             if (in_interrupt() || irqs_disabled())<br>
&gt;                       disable_irq_nosync(opal_irqs[i]);<br>
&gt;               else<br>
&gt;                       free_irq(opal_irqs[i], NULL);<br>
&gt; <br>
<br>
<br>
-- <br>
kernel-team mailing list<br>
<a href="mailto:kernel-team@lists.ubuntu.com" target="_blank">kernel-team@lists.ubuntu.com</a><br>
<a href="https://lists.ubuntu.com/mailman/listinfo/kernel-team" rel="noreferrer" target="_blank">https://lists.ubuntu.com/mailman/listinfo/kernel-team</a><br>
</blockquote></div></div>
diff mbox series

Patch

diff --git a/arch/powerpc/platforms/powernv/opal-irqchip.c b/arch/powerpc/platforms/powernv/opal-irqchip.c
index 9d1b8c0..05ffe05 100644
--- a/arch/powerpc/platforms/powernv/opal-irqchip.c
+++ b/arch/powerpc/platforms/powernv/opal-irqchip.c
@@ -177,7 +177,7 @@  void opal_event_shutdown(void)
 		if (!opal_irqs[i])
 			continue;
 
-		if (in_interrupt())
+		if (in_interrupt() || irqs_disabled())
 			disable_irq_nosync(opal_irqs[i]);
 		else
 			free_irq(opal_irqs[i], NULL);