lkml.org 
[lkml]   [2016]   [Mar]   [30]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v4 4/5] printk/nmi: increase the size of NMI buffer and make it configurable
    Date
    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>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
    ---
    init/Kconfig | 22 ++++++++++++++++++++++
    kernel/printk/nmi.c | 3 ++-
    2 files changed, 24 insertions(+), 1 deletion(-)

    diff --git a/init/Kconfig b/init/Kconfig
    index fd10deeefc22..1c9be9396a4a 100644
    --- a/init/Kconfig
    +++ b/init/Kconfig
    @@ -861,6 +861,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:
    #
    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;
    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 */
    --
    1.8.5.6
    \
     
     \ /
      Last update: 2016-03-30 18:01    [W:7.382 / U:0.168 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site