Linux kernel -stable discussions
 help / color / mirror / Atom feed
From: Sergey Senozhatsky <sergey.senozhatsky.work@gmail.com>
To: Petr Mladek <pmladek@suse.com>
Cc: Sergey Senozhatsky <sergey.senozhatsky@gmail.com>,
	Steven Rostedt <rostedt@goodmis.org>,
	Peter Zijlstra <peterz@infradead.org>,
	Tetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp>,
	Sergey Senozhatsky <sergey.senozhatsky.work@gmail.com>,
	linux-kernel@vger.kernel.org, "4 . 13+" <stable@vger.kernel.org>
Subject: Re: [PATCH] printk/nmi: Prevent deadlock when serializing NMI backtraces
Date: Fri, 18 May 2018 11:07:05 +0900	[thread overview]
Message-ID: <20180518020705.GB1160@jagdpanzerIV> (raw)
In-Reply-To: <20180517143903.19339-1-pmladek@suse.com>

On (05/17/18 16:39), Petr Mladek wrote:
> 
> CPU0			CPU1			CPU2
> 
> printk()
>   vprintk_emit()
>     spin_lock(&logbuf_lock)
> 
> 						trigger_all_cpu_backtrace()
> 						  raise()
> 
> 			nmi_enter()
> 			  printk_nmi_enter()
> 			    if (this_cpu_read(printk_context)
> 			      & PRINTK_SAFE_CONTEXT_MASK)
> 			      // false
> 			    else
> 			      // looks safe to use printk_deferred()
> 			      this_cpu_or(printk_context,
> 				PRINTK_NMI_DEFERRED_CONTEXT_MASK);
> 
> 			  nmi_cpu_backtrace()
> 			    arch_spin_lock(&lock);
> 			      show_regs()
> 
> nmi_enter()
>   nmi_cpu_backtrace()
>     arch_spin_lock(&lock);
> 
> 			      printk()
> 				vprintk_func()
> 				  vprintk_deferred()
> 				    vprintk_emit()
> 				      spin_lock(&logbuf_lock)
> 
> DEADLOCK: between &logbuf_lock from vprintk_emit() and
> 		  &lock from nmi_cpu_backtrace().
> 
> CPU0			CPU1
> lock(logbuf_lock)	lock(lock)
>   lock(lock)		  lock(logbuf_lock)
> 
[..]
> Signed-off-by: Petr Mladek <pmladek@suse.com>

This is a pretty cool find!

Acked-by: Sergey Senozhatsky <sergey.senozhatsky@gmail.com>

> -	if ((this_cpu_read(printk_context) & PRINTK_SAFE_CONTEXT_MASK) &&
> -	    raw_spin_is_locked(&logbuf_lock)) {
> +	if (raw_spin_is_locked(&logbuf_lock))
>  		this_cpu_or(printk_context, PRINTK_NMI_CONTEXT_MASK);
> -	} else {
> +	else
>  		this_cpu_or(printk_context, PRINTK_NMI_DEFERRED_CONTEXT_MASK);
> -	}

A question - can we switch to a bitwise OR?

if (this_cpu_read(printk_context) & PRINTK_SAFE_CONTEXT_MASK) ||
	raw_spin_is_locked(&logbuf_lock)

just to check per-CPU `printk_context' first and only afterwards
access the global `logbuf_lock'. printk_nmi_enter() happens on
every CPU, so maybe we can avoid some overhead by checking the
local per-CPU data first.

	-ss

  reply	other threads:[~2018-05-18  2:07 UTC|newest]

Thread overview: 22+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-05-17 14:39 [PATCH] printk/nmi: Prevent deadlock when serializing NMI backtraces Petr Mladek
2018-05-18  2:07 ` Sergey Senozhatsky [this message]
2018-05-18  6:38   ` Sergey Senozhatsky
2018-05-18  8:10     ` Petr Mladek
2018-05-22 21:43 ` Steven Rostedt
2018-05-23  2:01   ` Sergey Senozhatsky
2018-05-28 12:27     ` Petr Mladek
2018-06-05 12:47 ` Petr Mladek
2018-06-06  5:10   ` Sergey Senozhatsky
2018-06-06 10:33     ` Sergey Senozhatsky
2018-06-08 10:48       ` Petr Mladek
2018-06-18  6:37         ` Sergey Senozhatsky
2018-06-18  9:39           ` Petr Mladek
2018-06-18 10:07             ` Sergey Senozhatsky
2018-06-19  7:52               ` Petr Mladek
2018-06-19  8:27                 ` Sergey Senozhatsky
2018-06-19 13:23                   ` Steven Rostedt
2018-06-20  1:58                     ` Sergey Senozhatsky
2018-06-20  2:32                       ` Steven Rostedt
2018-06-20  4:17                         ` Sergey Senozhatsky
2018-06-06 11:15     ` Petr Mladek
2018-06-07  5:40       ` Sergey Senozhatsky

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=20180518020705.GB1160@jagdpanzerIV \
    --to=sergey.senozhatsky.work@gmail.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=penguin-kernel@I-love.SAKURA.ne.jp \
    --cc=peterz@infradead.org \
    --cc=pmladek@suse.com \
    --cc=rostedt@goodmis.org \
    --cc=sergey.senozhatsky@gmail.com \
    --cc=stable@vger.kernel.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