aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Documentation/kdump/kdump.txt7
-rw-r--r--Documentation/kernel-parameters.txt3
-rw-r--r--Documentation/sysctl/kernel.txt40
-rw-r--r--include/linux/kernel.h1
-rw-r--r--include/uapi/linux/sysctl.h1
-rw-r--r--kernel/panic.c13
-rw-r--r--kernel/sysctl.c9
-rw-r--r--kernel/sysctl_binary.c1
8 files changed, 61 insertions, 14 deletions
diff --git a/Documentation/kdump/kdump.txt b/Documentation/kdump/kdump.txt
index 6c0b9f27e465..bc4bd5a44b88 100644
--- a/Documentation/kdump/kdump.txt
+++ b/Documentation/kdump/kdump.txt
@@ -471,6 +471,13 @@ format. Crash is available on Dave Anderson's site at the following URL:
471 471
472 http://people.redhat.com/~anderson/ 472 http://people.redhat.com/~anderson/
473 473
474Trigger Kdump on WARN()
475=======================
476
477The kernel parameter, panic_on_warn, calls panic() in all WARN() paths. This
478will cause a kdump to occur at the panic() call. In cases where a user wants
479to specify this during runtime, /proc/sys/kernel/panic_on_warn can be set to 1
480to achieve the same behaviour.
474 481
475Contact 482Contact
476======= 483=======
diff --git a/Documentation/kernel-parameters.txt b/Documentation/kernel-parameters.txt
index 838f3776c924..d6eb3636fe5a 100644
--- a/Documentation/kernel-parameters.txt
+++ b/Documentation/kernel-parameters.txt
@@ -2509,6 +2509,9 @@ bytes respectively. Such letter suffixes can also be entirely omitted.
2509 timeout < 0: reboot immediately 2509 timeout < 0: reboot immediately
2510 Format: <timeout> 2510 Format: <timeout>
2511 2511
2512 panic_on_warn panic() instead of WARN(). Useful to cause kdump
2513 on a WARN().
2514
2512 crash_kexec_post_notifiers 2515 crash_kexec_post_notifiers
2513 Run kdump after running panic-notifiers and dumping 2516 Run kdump after running panic-notifiers and dumping
2514 kmsg. This only for the users who doubt kdump always 2517 kmsg. This only for the users who doubt kdump always
diff --git a/Documentation/sysctl/kernel.txt b/Documentation/sysctl/kernel.txt
index 57baff5bdb80..b5d0c8501a18 100644
--- a/Documentation/sysctl/kernel.txt
+++ b/Documentation/sysctl/kernel.txt
@@ -54,8 +54,9 @@ show up in /proc/sys/kernel:
54- overflowuid 54- overflowuid
55- panic 55- panic
56- panic_on_oops 56- panic_on_oops
57- panic_on_unrecovered_nmi
58- panic_on_stackoverflow 57- panic_on_stackoverflow
58- panic_on_unrecovered_nmi
59- panic_on_warn
59- pid_max 60- pid_max
60- powersave-nap [ PPC only ] 61- powersave-nap [ PPC only ]
61- printk 62- printk
@@ -527,19 +528,6 @@ the recommended setting is 60.
527 528
528============================================================== 529==============================================================
529 530
530panic_on_unrecovered_nmi:
531
532The default Linux behaviour on an NMI of either memory or unknown is
533to continue operation. For many environments such as scientific
534computing it is preferable that the box is taken out and the error
535dealt with than an uncorrected parity/ECC error get propagated.
536
537A small number of systems do generate NMI's for bizarre random reasons
538such as power management so the default is off. That sysctl works like
539the existing panic controls already in that directory.
540
541==============================================================
542
543panic_on_oops: 531panic_on_oops:
544 532
545Controls the kernel's behaviour when an oops or BUG is encountered. 533Controls the kernel's behaviour when an oops or BUG is encountered.
@@ -563,6 +551,30 @@ This file shows up if CONFIG_DEBUG_STACKOVERFLOW is enabled.
563 551
564============================================================== 552==============================================================
565 553
554panic_on_unrecovered_nmi:
555
556The default Linux behaviour on an NMI of either memory or unknown is
557to continue operation. For many environments such as scientific
558computing it is preferable that the box is taken out and the error
559dealt with than an uncorrected parity/ECC error get propagated.
560
561A small number of systems do generate NMI's for bizarre random reasons
562such as power management so the default is off. That sysctl works like
563the existing panic controls already in that directory.
564
565==============================================================
566
567panic_on_warn:
568
569Calls panic() in the WARN() path when set to 1. This is useful to avoid
570a kernel rebuild when attempting to kdump at the location of a WARN().
571
5720: only WARN(), default behaviour.
573
5741: call panic() after printing out WARN() location.
575
576==============================================================
577
566perf_cpu_time_max_percent: 578perf_cpu_time_max_percent:
567 579
568Hints to the kernel how much CPU time it should be allowed to 580Hints to the kernel how much CPU time it should be allowed to
diff --git a/include/linux/kernel.h b/include/linux/kernel.h
index 446d76a87ba1..233ea8107038 100644
--- a/include/linux/kernel.h
+++ b/include/linux/kernel.h
@@ -427,6 +427,7 @@ extern int panic_timeout;
427extern int panic_on_oops; 427extern int panic_on_oops;
428extern int panic_on_unrecovered_nmi; 428extern int panic_on_unrecovered_nmi;
429extern int panic_on_io_nmi; 429extern int panic_on_io_nmi;
430extern int panic_on_warn;
430extern int sysctl_panic_on_stackoverflow; 431extern int sysctl_panic_on_stackoverflow;
431/* 432/*
432 * Only to be used by arch init code. If the user over-wrote the default 433 * Only to be used by arch init code. If the user over-wrote the default
diff --git a/include/uapi/linux/sysctl.h b/include/uapi/linux/sysctl.h
index 43aaba1cc037..0956373b56db 100644
--- a/include/uapi/linux/sysctl.h
+++ b/include/uapi/linux/sysctl.h
@@ -153,6 +153,7 @@ enum
153 KERN_MAX_LOCK_DEPTH=74, /* int: rtmutex's maximum lock depth */ 153 KERN_MAX_LOCK_DEPTH=74, /* int: rtmutex's maximum lock depth */
154 KERN_NMI_WATCHDOG=75, /* int: enable/disable nmi watchdog */ 154 KERN_NMI_WATCHDOG=75, /* int: enable/disable nmi watchdog */
155 KERN_PANIC_ON_NMI=76, /* int: whether we will panic on an unrecovered */ 155 KERN_PANIC_ON_NMI=76, /* int: whether we will panic on an unrecovered */
156 KERN_PANIC_ON_WARN=77, /* int: call panic() in WARN() functions */
156}; 157};
157 158
158 159
diff --git a/kernel/panic.c b/kernel/panic.c
index cf80672b7924..4d8d6f906dec 100644
--- a/kernel/panic.c
+++ b/kernel/panic.c
@@ -33,6 +33,7 @@ static int pause_on_oops;
33static int pause_on_oops_flag; 33static int pause_on_oops_flag;
34static DEFINE_SPINLOCK(pause_on_oops_lock); 34static DEFINE_SPINLOCK(pause_on_oops_lock);
35static bool crash_kexec_post_notifiers; 35static bool crash_kexec_post_notifiers;
36int panic_on_warn __read_mostly;
36 37
37int panic_timeout = CONFIG_PANIC_TIMEOUT; 38int panic_timeout = CONFIG_PANIC_TIMEOUT;
38EXPORT_SYMBOL_GPL(panic_timeout); 39EXPORT_SYMBOL_GPL(panic_timeout);
@@ -428,6 +429,17 @@ static void warn_slowpath_common(const char *file, int line, void *caller,
428 if (args) 429 if (args)
429 vprintk(args->fmt, args->args); 430 vprintk(args->fmt, args->args);
430 431
432 if (panic_on_warn) {
433 /*
434 * This thread may hit another WARN() in the panic path.
435 * Resetting this prevents additional WARN() from panicking the
436 * system on this thread. Other threads are blocked by the
437 * panic_mutex in panic().
438 */
439 panic_on_warn = 0;
440 panic("panic_on_warn set ...\n");
441 }
442
431 print_modules(); 443 print_modules();
432 dump_stack(); 444 dump_stack();
433 print_oops_end_marker(); 445 print_oops_end_marker();
@@ -485,6 +497,7 @@ EXPORT_SYMBOL(__stack_chk_fail);
485 497
486core_param(panic, panic_timeout, int, 0644); 498core_param(panic, panic_timeout, int, 0644);
487core_param(pause_on_oops, pause_on_oops, int, 0644); 499core_param(pause_on_oops, pause_on_oops, int, 0644);
500core_param(panic_on_warn, panic_on_warn, int, 0644);
488 501
489static int __init setup_crash_kexec_post_notifiers(char *s) 502static int __init setup_crash_kexec_post_notifiers(char *s)
490{ 503{
diff --git a/kernel/sysctl.c b/kernel/sysctl.c
index 15f2511a1b7c..7c54ff79afd7 100644
--- a/kernel/sysctl.c
+++ b/kernel/sysctl.c
@@ -1104,6 +1104,15 @@ static struct ctl_table kern_table[] = {
1104 .proc_handler = proc_dointvec, 1104 .proc_handler = proc_dointvec,
1105 }, 1105 },
1106#endif 1106#endif
1107 {
1108 .procname = "panic_on_warn",
1109 .data = &panic_on_warn,
1110 .maxlen = sizeof(int),
1111 .mode = 0644,
1112 .proc_handler = proc_dointvec_minmax,
1113 .extra1 = &zero,
1114 .extra2 = &one,
1115 },
1107 { } 1116 { }
1108}; 1117};
1109 1118
diff --git a/kernel/sysctl_binary.c b/kernel/sysctl_binary.c
index 9a4f750a2963..7e7746a42a62 100644
--- a/kernel/sysctl_binary.c
+++ b/kernel/sysctl_binary.c
@@ -137,6 +137,7 @@ static const struct bin_table bin_kern_table[] = {
137 { CTL_INT, KERN_COMPAT_LOG, "compat-log" }, 137 { CTL_INT, KERN_COMPAT_LOG, "compat-log" },
138 { CTL_INT, KERN_MAX_LOCK_DEPTH, "max_lock_depth" }, 138 { CTL_INT, KERN_MAX_LOCK_DEPTH, "max_lock_depth" },
139 { CTL_INT, KERN_PANIC_ON_NMI, "panic_on_unrecovered_nmi" }, 139 { CTL_INT, KERN_PANIC_ON_NMI, "panic_on_unrecovered_nmi" },
140 { CTL_INT, KERN_PANIC_ON_WARN, "panic_on_warn" },
140 {} 141 {}
141}; 142};
142 143