public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
From: Andrew Morton <akpm@linux-foundation.org>
To: Vikram Mulukutla <markivx@codeaurora.org>
Cc: Michael Holzheu <holzheu@linux.vnet.ibm.com>,
	Stephen Boyd <sboyd@codeaurora.org>,
	linux-kernel@vger.kernel.org
Subject: Re: [PATCH] panic: Fix a possible deadlock in panic()
Date: Fri, 29 Jun 2012 13:29:35 -0700	[thread overview]
Message-ID: <20120629132935.45f731e1.akpm@linux-foundation.org> (raw)
In-Reply-To: <1340926985-8270-1-git-send-email-markivx@codeaurora.org>

On Thu, 28 Jun 2012 16:43:05 -0700
Vikram Mulukutla <markivx@codeaurora.org> wrote:

> panic_lock is meant to ensure that panic processing takes
> place only on one cpu; if any of the other cpus encounter
> a panic, they will spin waiting to be shut down.
> 
> However, this causes a regression in this scenario:
> 
> 1. Cpu 0 encounters a panic and acquires the panic_lock
>    and proceeds with the panic processing.
> 2. There is an interrupt on cpu 0 that also encounters
>    an error condition and invokes panic.
> 3. This second invocation fails to acquire the panic_lock
>    and enters the infinite while loop in panic_smp_self_stop.
> 
> Thus all panic processing is stopped, and the cpu is stuck
> for eternity in the while(1) inside panic_smp_self_stop.
> 
> To address this, disable local interrupts with
> local_irq_disable before acquiring the panic_lock. This will
> prevent interrupt handlers from executing during the panic
> processing, thus avoiding this particular problem.
> 
> --- a/kernel/panic.c
> +++ b/kernel/panic.c
> @@ -75,6 +75,14 @@ void panic(const char *fmt, ...)
>  	int state = 0;
>  
>  	/*
> +	 * Disable local interrupts. This will prevent panic_smp_self_stop
> +	 * from deadlocking the first cpu that invokes the panic, since
> +	 * there is nothing to prevent an interrupt handler (that runs
> +	 * after the panic_lock is acquired) from invoking panic again.
> +	 */
> +	local_irq_disable();
> +
> +	/*
>  	 * It's possible to come here directly from a panic-assertion and
>  	 * not have preempt disabled. Some functions called from here want
>  	 * preempt to be disabled. No point enabling it later though...

Seems sane.  panic() *should* work correctly when called with
interrupts disabled, so there be no bad effects from internally
disabling interrupts.  If there are bad effects, we should fix them up.


      parent reply	other threads:[~2012-06-29 20:29 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-06-28 23:43 [PATCH] panic: Fix a possible deadlock in panic() Vikram Mulukutla
2012-06-29  6:54 ` Michael Holzheu
2012-06-29 20:29 ` Andrew Morton [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20120629132935.45f731e1.akpm@linux-foundation.org \
    --to=akpm@linux-foundation.org \
    --cc=holzheu@linux.vnet.ibm.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=markivx@codeaurora.org \
    --cc=sboyd@codeaurora.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox