Messages in this thread | | | Date | Wed, 20 May 2020 17:07:52 +0100 | From | Daniel Thompson <> | Subject | Re: [PATCH v2] printk/kdb: Redirect printk messages into kdb in any context |
| |
On Wed, May 20, 2020 at 12:22:33PM +0200, Petr Mladek wrote: > kdb has to get messages on consoles even when the system is stopped. > It uses kdb_printf() internally and calls console drivers on its own. > > It uses a hack to reuse an existing code. It sets "kdb_trap_printk" > global variable to redirect even the normal printk() into the > kdb_printf() variant. > > The variable "kdb_trap_printk" is checked in printk_default() and > it is ignored when printk is redirected to printk_safe in NMI context. > Solve this by moving the check into printk_func(). > > It is obvious that it is not fully safe. But it does not make things > worse. The console drivers are already called in this context by > db_printf() direct calls. > > Reported-by: Sumit Garg <sumit.garg@linaro.org> > Tested-by: Sumit Garg <sumit.garg@linaro.org> > Signed-off-by: Petr Mladek <pmladek@suse.com>
Reviewed-by: Daniel Thompson <daniel.thompson@linaro.org>
> --- > Changes in v2: > > + more detailed commit message > > kernel/printk/printk.c | 14 +------------- > kernel/printk/printk_safe.c | 7 +++++++ > 2 files changed, 8 insertions(+), 13 deletions(-) > > diff --git a/kernel/printk/printk.c b/kernel/printk/printk.c > index 9a9b6156270b..63a1aa377cd9 100644 > --- a/kernel/printk/printk.c > +++ b/kernel/printk/printk.c > @@ -35,7 +35,6 @@ > #include <linux/memblock.h> > #include <linux/syscalls.h> > #include <linux/crash_core.h> > -#include <linux/kdb.h> > #include <linux/ratelimit.h> > #include <linux/kmsg_dump.h> > #include <linux/syslog.h> > @@ -2036,18 +2035,7 @@ EXPORT_SYMBOL(vprintk); > > int vprintk_default(const char *fmt, va_list args) > { > - int r; > - > -#ifdef CONFIG_KGDB_KDB > - /* Allow to pass printk() to kdb but avoid a recursion. */ > - if (unlikely(kdb_trap_printk && kdb_printf_cpu < 0)) { > - r = vkdb_printf(KDB_MSGSRC_PRINTK, fmt, args); > - return r; > - } > -#endif > - r = vprintk_emit(0, LOGLEVEL_DEFAULT, NULL, 0, fmt, args); > - > - return r; > + return vprintk_emit(0, LOGLEVEL_DEFAULT, NULL, 0, fmt, args); > } > EXPORT_SYMBOL_GPL(vprintk_default); > > diff --git a/kernel/printk/printk_safe.c b/kernel/printk/printk_safe.c > index d9a659a686f3..7ccb821d0bfe 100644 > --- a/kernel/printk/printk_safe.c > +++ b/kernel/printk/printk_safe.c > @@ -6,6 +6,7 @@ > #include <linux/preempt.h> > #include <linux/spinlock.h> > #include <linux/debug_locks.h> > +#include <linux/kdb.h> > #include <linux/smp.h> > #include <linux/cpumask.h> > #include <linux/irq_work.h> > @@ -359,6 +360,12 @@ void __printk_safe_exit(void) > > __printf(1, 0) int vprintk_func(const char *fmt, va_list args) > { > +#ifdef CONFIG_KGDB_KDB > + /* Allow to pass printk() to kdb but avoid a recursion. */ > + if (unlikely(kdb_trap_printk && kdb_printf_cpu < 0)) > + return vkdb_printf(KDB_MSGSRC_PRINTK, fmt, args); > +#endif > + > /* > * Try to use the main logbuf even in NMI. But avoid calling console > * drivers that might have their own locks. > -- > 2.26.1 >
| |