summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPetr Mladek <pmladek@suse.com>2016-05-20 20:00:39 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2016-05-20 20:58:30 -0400
commit427934b8714ec130b068d1c9d88f25b24aaede32 (patch)
tree2d72fdd828f1fe84c948225b680fe26de7be2536
parentb522deabc6f18e4f938d93a84f345f2cbf3347d1 (diff)
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 a9edc8809328 ("x86/nmi: Perform a safe NMI stack trace on all CPUs"). Nobody noticed it because it did not print any warnings. Signed-off-by: Petr 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: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
-rw-r--r--init/Kconfig22
-rw-r--r--kernel/printk/nmi.c3
2 files changed, 24 insertions, 1 deletions
diff --git a/init/Kconfig b/init/Kconfig
index bccc1d607be5..a9c4aefd5436 100644
--- a/init/Kconfig
+++ b/init/Kconfig
@@ -862,6 +862,28 @@ config LOG_CPU_MAX_BUF_SHIFT
862 13 => 8 KB for each CPU 862 13 => 8 KB for each CPU
863 12 => 4 KB for each CPU 863 12 => 4 KB for each CPU
864 864
865config NMI_LOG_BUF_SHIFT
866 int "Temporary per-CPU NMI log buffer size (12 => 4KB, 13 => 8KB)"
867 range 10 21
868 default 13
869 depends on PRINTK_NMI
870 help
871 Select the size of a per-CPU buffer where NMI messages are temporary
872 stored. They are copied to the main log buffer in a safe context
873 to avoid a deadlock. The value defines the size as a power of 2.
874
875 NMI messages are rare and limited. The largest one is when
876 a backtrace is printed. It usually fits into 4KB. Select
877 8KB if you want to be on the safe side.
878
879 Examples:
880 17 => 128 KB for each CPU
881 16 => 64 KB for each CPU
882 15 => 32 KB for each CPU
883 14 => 16 KB for each CPU
884 13 => 8 KB for each CPU
885 12 => 4 KB for each CPU
886
865# 887#
866# Architectures with an unreliable sched_clock() should select this: 888# Architectures with an unreliable sched_clock() should select this:
867# 889#
diff --git a/kernel/printk/nmi.c b/kernel/printk/nmi.c
index 572f94922230..bf08557d7e3d 100644
--- a/kernel/printk/nmi.c
+++ b/kernel/printk/nmi.c
@@ -41,7 +41,8 @@ DEFINE_PER_CPU(printk_func_t, printk_func) = vprintk_default;
41static int printk_nmi_irq_ready; 41static int printk_nmi_irq_ready;
42atomic_t nmi_message_lost; 42atomic_t nmi_message_lost;
43 43
44#define NMI_LOG_BUF_LEN (4096 - sizeof(atomic_t) - sizeof(struct irq_work)) 44#define NMI_LOG_BUF_LEN ((1 << CONFIG_NMI_LOG_BUF_SHIFT) - \
45 sizeof(atomic_t) - sizeof(struct irq_work))
45 46
46struct nmi_seq_buf { 47struct nmi_seq_buf {
47 atomic_t len; /* length of written data */ 48 atomic_t len; /* length of written data */