There have been several times where I have had to rebuild a kernel to cause a panic when hitting a WARN() in the code in order to get a crash dump from a system. Sometimes this is easy to do, other times (such as in the case of a remote admin) it is not trivial to send new images to the user. A much easier method would be a switch to change the WARN() over to a BUG(). This makes debugging easier in that I can now test the actual image the WARN() was seen on and I do not have to engage in remote debugging. This patch adds a bug_on_warn kernel parameter, which calls BUG() in the warn_slowpath_common() path. The function will still print out the location of the warning. Successfully tested by me. Cc: Jonathan Corbet <corbet@xxxxxxx> Cc: Andrew Morton <akpm@xxxxxxxxxxxxxxxxxxxx> Cc: Rusty Russell <rusty@xxxxxxxxxxxxxxx> Cc: "H. Peter Anvin" <hpa@xxxxxxxxx> Cc: Andi Kleen <ak@xxxxxxxxxxxxxxx> Cc: Masami Hiramatsu <masami.hiramatsu.pt@xxxxxxxxxxx> Cc: Fabian Frederick <fabf@xxxxxxxxx> Cc: linux-doc@xxxxxxxxxxxxxxx Signed-off-by: Prarit Bhargava <prarit@xxxxxxxxxx> --- Documentation/kernel-parameters.txt | 2 ++ kernel/panic.c | 16 +++++++++++++++- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/Documentation/kernel-parameters.txt b/Documentation/kernel-parameters.txt index 7dbe5ec..2967542 100644 --- a/Documentation/kernel-parameters.txt +++ b/Documentation/kernel-parameters.txt @@ -553,6 +553,8 @@ bytes respectively. Such letter suffixes can also be entirely omitted. bttv.pll= See Documentation/video4linux/bttv/Insmod-options bttv.tuner= + bug_on_warn BUG() instead of WARN() + bulk_remove=off [PPC] This parameter disables the use of the pSeries firmware feature for flushing multiple hpte entries at a time. diff --git a/kernel/panic.c b/kernel/panic.c index d09dc5c..258a7be 100644 --- a/kernel/panic.c +++ b/kernel/panic.c @@ -33,6 +33,7 @@ static int pause_on_oops; static int pause_on_oops_flag; static DEFINE_SPINLOCK(pause_on_oops_lock); static bool crash_kexec_post_notifiers; +static bool bug_on_warn; int panic_timeout = CONFIG_PANIC_TIMEOUT; EXPORT_SYMBOL_GPL(panic_timeout); @@ -420,13 +421,19 @@ static void warn_slowpath_common(const char *file, int line, void *caller, { disable_trace_on_warning(); - pr_warn("------------[ cut here ]------------\n"); + if (!bug_on_warn) + pr_warn("------------[ cut here ]------------\n"); pr_warn("WARNING: CPU: %d PID: %d at %s:%d %pS()\n", raw_smp_processor_id(), current->pid, file, line, caller); if (args) vprintk(args->fmt, args->args); + if (bug_on_warn) { + pr_warn("bug_on_warn set, calling BUG()...\n"); + BUG(); + } + print_modules(); dump_stack(); print_oops_end_marker(); @@ -501,3 +508,10 @@ static int __init oops_setup(char *s) return 0; } early_param("oops", oops_setup); + +static int __init bug_on_warn_setup(char *s) +{ + bug_on_warn = true; + return 0; +} +early_param("bug_on_warn", bug_on_warn_setup); -- 1.7.9.3 -- To unsubscribe from this list: send the line "unsubscribe linux-doc" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html