summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-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 */