The patch titled Subject: printk-nmi-generic-solution-for-safe-printk-in-nmi-v4 has been added to the -mm tree. Its filename is printk-nmi-generic-solution-for-safe-printk-in-nmi-v4.patch This patch should soon appear at http://ozlabs.org/~akpm/mmots/broken-out/printk-nmi-generic-solution-for-safe-printk-in-nmi-v4.patch and later at http://ozlabs.org/~akpm/mmotm/broken-out/printk-nmi-generic-solution-for-safe-printk-in-nmi-v4.patch Before you just go and hit "reply", please: a) Consider who else should be cc'ed b) Prefer to cc a suitable mailing list as well c) Ideally: find the original patch on the mailing list and do a reply-to-all to that, adding suitable additional cc's *** Remember to use Documentation/SubmitChecklist when testing your code *** The -mm tree is included into linux-next and is updated there every 3-4 working days ------------------------------------------------------ From: Petr Mladek <pmladek@xxxxxxxx> Subject: printk-nmi-generic-solution-for-safe-printk-in-nmi-v4 rename from kernel/printk/printk.h rename to kernel/printk/internal.h Signed-off-by: Petr Mladek <pmladek@xxxxxxxx> Signed-off-by: Andrew Morton <akpm@xxxxxxxxxxxxxxxxxxxx> --- kernel/printk/internal.h | 44 +++++++++++++++++++++++++++++++++++++ kernel/printk/nmi.c | 14 +++++++---- kernel/printk/printk.c | 2 - kernel/printk/printk.h | 44 ------------------------------------- 4 files changed, 54 insertions(+), 50 deletions(-) diff -puN /dev/null kernel/printk/internal.h --- /dev/null +++ a/kernel/printk/internal.h @@ -0,0 +1,44 @@ +/* + * internal.h - printk internal definitions + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see <http://www.gnu.org/licenses/>. + */ +#include <linux/percpu.h> + +typedef __printf(1, 0) int (*printk_func_t)(const char *fmt, va_list args); + +int __printf(1, 0) vprintk_default(const char *fmt, va_list args); + +#ifdef CONFIG_PRINTK_NMI + +/* + * printk() could not take logbuf_lock in NMI context. Instead, + * it temporary stores the strings into a per-CPU buffer. + * The alternative implementation is chosen transparently + * via per-CPU variable. + */ +DECLARE_PER_CPU(printk_func_t, printk_func); +static inline __printf(1, 0) int vprintk_func(const char *fmt, va_list args) +{ + return this_cpu_read(printk_func)(fmt, args); +} + +#else /* CONFIG_PRINTK_NMI */ + +static inline __printf(1, 0) int vprintk_func(const char *fmt, va_list args) +{ + return vprintk_default(fmt, args); +} + +#endif /* CONFIG_PRINTK_NMI */ diff -puN kernel/printk/nmi.c~printk-nmi-generic-solution-for-safe-printk-in-nmi-v4 kernel/printk/nmi.c --- a/kernel/printk/nmi.c~printk-nmi-generic-solution-for-safe-printk-in-nmi-v4 +++ a/kernel/printk/nmi.c @@ -22,7 +22,7 @@ #include <linux/irq_work.h> #include <linux/printk.h> -#include "printk.h" +#include "internal.h" /* * printk() could not take logbuf_lock in NMI context. Instead, @@ -57,12 +57,13 @@ static DEFINE_PER_CPU(struct nmi_seq_buf static int vprintk_nmi(const char *fmt, va_list args) { struct nmi_seq_buf *s = this_cpu_ptr(&nmi_print_seq); - int add = 0, len; + int add = 0; + size_t len; again: len = atomic_read(&s->len); - if (len >= sizeof(s->buffer)) + if (len >= sizeof(s->buffer)) return 0; /* @@ -109,7 +110,8 @@ static void __printk_nmi_flush(struct ir static raw_spinlock_t read_lock = __RAW_SPIN_LOCK_INITIALIZER(read_lock); struct nmi_seq_buf *s = container_of(work, struct nmi_seq_buf, work); - int len, size, i, last_i; + size_t len, size; + int i, last_i; /* * The lock has two functions. First, one reader has to flush all @@ -129,7 +131,9 @@ more: * the buffer an unexpected way. If we printed something then * @len must only increase. */ - WARN_ON(i && i >= len); + if (i && i >= len) + pr_err("printk_nmi_flush: internal error: i=%d >= len=%lu\n", + i, len); if (!len) goto out; /* Someone else has already flushed the buffer. */ diff -puN kernel/printk/printk.c~printk-nmi-generic-solution-for-safe-printk-in-nmi-v4 kernel/printk/printk.c --- a/kernel/printk/printk.c~printk-nmi-generic-solution-for-safe-printk-in-nmi-v4 +++ a/kernel/printk/printk.c @@ -55,7 +55,7 @@ #include "console_cmdline.h" #include "braille.h" -#include "printk.h" +#include "internal.h" int console_printk[4] = { CONSOLE_LOGLEVEL_DEFAULT, /* console_loglevel */ diff -puN kernel/printk/printk.h~printk-nmi-generic-solution-for-safe-printk-in-nmi-v4 /dev/null --- a/kernel/printk/printk.h +++ /dev/null @@ -1,44 +0,0 @@ -/* - * printk.h - printk internal definitions - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, see <http://www.gnu.org/licenses/>. - */ -#include <linux/percpu.h> - -typedef __printf(1, 0) int (*printk_func_t)(const char *fmt, va_list args); - -int __printf(1, 0) vprintk_default(const char *fmt, va_list args); - -#ifdef CONFIG_PRINTK_NMI - -/* - * printk() could not take logbuf_lock in NMI context. Instead, - * it temporary stores the strings into a per-CPU buffer. - * The alternative implementation is chosen transparently - * via per-CPU variable. - */ -DECLARE_PER_CPU(printk_func_t, printk_func); -static inline __printf(1, 0) int vprintk_func(const char *fmt, va_list args) -{ - return this_cpu_read(printk_func)(fmt, args); -} - -#else /* CONFIG_PRINTK_NMI */ - -static inline __printf(1, 0) int vprintk_func(const char *fmt, va_list args) -{ - return vprintk_default(fmt, args); -} - -#endif /* CONFIG_PRINTK_NMI */ _ Patches currently in -mm which might be from pmladek@xxxxxxxx are printk-nmi-generic-solution-for-safe-printk-in-nmi.patch printk-nmi-generic-solution-for-safe-printk-in-nmi-v4.patch printk-nmi-use-irq-work-only-when-ready.patch printk-nmi-warn-when-some-message-has-been-lost-in-nmi-context.patch printk-nmi-increase-the-size-of-nmi-buffer-and-make-it-configurable.patch printk-nmi-increase-the-size-of-nmi-buffer-and-make-it-configurable-fix.patch -- To unsubscribe from this list: send the line "unsubscribe mm-commits" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html