Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 427934b8 authored by Petr Mladek's avatar Petr Mladek Committed by Linus Torvalds
Browse files

printk/nmi: increase the size of NMI buffer and make it configurable



Testing has shown that the backtrace sometimes does not fit into the 4kB
temporary buffer that is used in NMI context.  The warnings are gone
when I double the temporary buffer size.

This patch doubles the buffer size and makes it configurable.

Note that this problem existed even in the x86-specific implementation
that was added by the commit a9edc880 ("x86/nmi: Perform a safe NMI
stack trace on all CPUs").  Nobody noticed it because it did not print
any warnings.

Signed-off-by: default avatarPetr Mladek <pmladek@suse.com>
Cc: Jan Kara <jack@suse.cz>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Steven Rostedt <rostedt@goodmis.org>
Cc: Russell King <rmk+kernel@arm.linux.org.uk>
Cc: Daniel Thompson <daniel.thompson@linaro.org>
Cc: Jiri Kosina <jkosina@suse.com>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Ralf Baechle <ralf@linux-mips.org>
Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Cc: Martin Schwidefsky <schwidefsky@de.ibm.com>
Cc: David Miller <davem@davemloft.net>
Cc: Daniel Thompson <daniel.thompson@linaro.org>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent b522deab
Loading
Loading
Loading
Loading
+22 −0
Original line number Diff line number Diff line
@@ -862,6 +862,28 @@ config LOG_CPU_MAX_BUF_SHIFT
		     13 =>   8 KB for each CPU
		     12 =>   4 KB for each CPU

config NMI_LOG_BUF_SHIFT
	int "Temporary per-CPU NMI log buffer size (12 => 4KB, 13 => 8KB)"
	range 10 21
	default 13
	depends on PRINTK_NMI
	help
	  Select the size of a per-CPU buffer where NMI messages are temporary
	  stored. They are copied to the main log buffer in a safe context
	  to avoid a deadlock. The value defines the size as a power of 2.

	  NMI messages are rare and limited. The largest one is when
	  a backtrace is printed. It usually fits into 4KB. Select
	  8KB if you want to be on the safe side.

	  Examples:
		     17 => 128 KB for each CPU
		     16 =>  64 KB for each CPU
		     15 =>  32 KB for each CPU
		     14 =>  16 KB for each CPU
		     13 =>   8 KB for each CPU
		     12 =>   4 KB for each CPU

#
# Architectures with an unreliable sched_clock() should select this:
#
+2 −1
Original line number Diff line number Diff line
@@ -41,7 +41,8 @@ DEFINE_PER_CPU(printk_func_t, printk_func) = vprintk_default;
static int printk_nmi_irq_ready;
atomic_t nmi_message_lost;

#define NMI_LOG_BUF_LEN (4096 - sizeof(atomic_t) - sizeof(struct irq_work))
#define NMI_LOG_BUF_LEN ((1 << CONFIG_NMI_LOG_BUF_SHIFT) -		\
			 sizeof(atomic_t) - sizeof(struct irq_work))

struct nmi_seq_buf {
	atomic_t		len;	/* length of written data */