Messages in this thread Patch in this message | | | From | Eugeniu Rosca <> | Subject | [RFC PATCH 2/3] printk: add console_verbose_{start,end} | Date | Sun, 15 Mar 2020 18:09:02 +0100 |
| |
Consider below example scenarios: - soft lockup - hard lockup - hung task - scheduling while atomic - rcu stall - oops - oom - WARN
In most of the above situations, it is up to the user to terminate the execution with a panic (see panic_on_* in kernel/sysctl.c) or to decide not to abort and try to recover.
A general concern applicable to the above use-cases is that, depending on the console loglevel set by the user, precious information conveyed by show_regs(), print_modules(), dump_stack() and friends may simply not appear on the console. Below example commits tackle this exact concern in the panic paths:
* commit 168e06f7937d96 ("kernel/hung_task.c: force console verbose before panic") * commit 5b530fc1832460 ("panic: call console_verbose() in panic")
The approach behind the above commits is straightforward. Whenever panic is imminent, they simply call console_verbose(). Unfortunately, the same technique does not apply to non-panic paths. It requires a counterpart of console_verbose(), which currently does not exist.
With that in mind, create a pair of functions named console_verbose_start() and console_verbose_end() which turn the console verbosity on and off in a lockless and SMP safe way.
Cc: Petr Mladek <pmladek@suse.com> Cc: Sergey Senozhatsky <sergey.senozhatsky@gmail.com> Cc: Steven Rostedt <rostedt@goodmis.org> Cc: Ingo Molnar <mingo@kernel.org> Signed-off-by: Eugeniu Rosca <erosca@de.adit-jv.com> --- include/linux/printk.h | 10 ++++++++++ 1 file changed, 10 insertions(+)
diff --git a/include/linux/printk.h b/include/linux/printk.h index 1e6108b8d15f..14755ef7b017 100644 --- a/include/linux/printk.h +++ b/include/linux/printk.h @@ -3,6 +3,7 @@ #define __KERNEL_PRINTK__ #include <stdarg.h> +#include <linux/atomic.h> #include <linux/init.h> #include <linux/kern_levels.h> #include <linux/linkage.h> @@ -77,6 +78,15 @@ static inline void console_verbose(void) console_loglevel = CONSOLE_LOGLEVEL_MOTORMOUTH; } +#ifdef CONFIG_PRINTK +extern atomic_t ignore_loglevel; +static inline void console_verbose_start(void) { atomic_inc(&ignore_loglevel); } +static inline void console_verbose_end(void) { atomic_dec(&ignore_loglevel); } +#else +static inline void console_verbose_start(void) { } +static inline void console_verbose_end(void) { } +#endif + /* strlen("ratelimit") + 1 */ #define DEVKMSG_STR_MAX_SIZE 10 extern char devkmsg_log_str[]; -- 2.25.0
| |