diff options
-rw-r--r-- | init/Kconfig | 22 | ||||
-rw-r--r-- | kernel/printk/nmi.c | 3 |
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 | ||
865 | config 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; | |||
41 | static int printk_nmi_irq_ready; | 41 | static int printk_nmi_irq_ready; |
42 | atomic_t nmi_message_lost; | 42 | atomic_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 | ||
46 | struct nmi_seq_buf { | 47 | struct nmi_seq_buf { |
47 | atomic_t len; /* length of written data */ | 48 | atomic_t len; /* length of written data */ |