sysrq, kdump: make sysrq-c consistent

commit d6580a9f15 ("kexec: sysrq: simplify
sysrq-c handler") changed the behavior of sysrq-c to unconditional
dereference of NULL pointer.  So in cases with CONFIG_KEXEC, where
crash_kexec() was directly called from sysrq-c before, now it can be said
that a step of "real oops" was inserted before starting kdump.

However, in contrast to oops via SysRq-c from keyboard which results in
panic due to in_interrupt(), oops via "echo c > /proc/sysrq-trigger" will
not become panic unless panic_on_oops=1.  It means that even if dump is
properly configured to be taken on panic, the sysrq-c from proc interface
might not start crashdump while the sysrq-c from keyboard can start
crashdump.  This confuses traditional users of kdump, i.e.  people who
expect sysrq-c to do common behavior in both of the keyboard and proc
interface.

This patch brings the keyboard and proc interface behavior of sysrq-c in
line, by forcing panic_on_oops=1 before oops in sysrq-c handler.

And some updates in documentation are included, to clarify that there is
no longer dependency with CONFIG_KEXEC, and that now the system can just
crash by sysrq-c if no dump mechanism is configured.

Signed-off-by: Hidetoshi Seto <seto.hidetoshi@jp.fujitsu.com>
Cc: Lai Jiangshan <laijs@cn.fujitsu.com>
Cc: Ken'ichi Ohmichi <oomichi@mxs.nes.nec.co.jp>
Acked-by: Neil Horman <nhorman@tuxdriver.com>
Acked-by: Vivek Goyal <vgoyal@redhat.com>
Cc: Brayan Arraes <brayan@yack.com.br>
Cc: Eric W. Biederman <ebiederm@xmission.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
Hidetoshi Seto 2009-07-29 15:04:14 -07:00 committed by Linus Torvalds
parent f5a55efa14
commit cab8bd3410
2 changed files with 9 additions and 6 deletions

View file

@ -66,7 +66,8 @@ On all - write a character to /proc/sysrq-trigger. e.g.:
'b' - Will immediately reboot the system without syncing or unmounting 'b' - Will immediately reboot the system without syncing or unmounting
your disks. your disks.
'c' - Will perform a kexec reboot in order to take a crashdump. 'c' - Will perform a system crash by a NULL pointer dereference.
A crashdump will be taken if configured.
'd' - Shows all locks that are held. 'd' - Shows all locks that are held.
@ -141,8 +142,8 @@ useful when you want to exit a program that will not let you switch consoles.
re'B'oot is good when you're unable to shut down. But you should also 'S'ync re'B'oot is good when you're unable to shut down. But you should also 'S'ync
and 'U'mount first. and 'U'mount first.
'C'rashdump can be used to manually trigger a crashdump when the system is hung. 'C'rash can be used to manually trigger a crashdump when the system is hung.
The kernel needs to have been built with CONFIG_KEXEC enabled. Note that this just triggers a crash if there is no dump mechanism available.
'S'ync is great when your system is locked up, it allows you to sync your 'S'ync is great when your system is locked up, it allows you to sync your
disks and will certainly lessen the chance of data loss and fscking. Note disks and will certainly lessen the chance of data loss and fscking. Note

View file

@ -35,7 +35,6 @@
#include <linux/spinlock.h> #include <linux/spinlock.h>
#include <linux/vt_kern.h> #include <linux/vt_kern.h>
#include <linux/workqueue.h> #include <linux/workqueue.h>
#include <linux/kexec.h>
#include <linux/hrtimer.h> #include <linux/hrtimer.h>
#include <linux/oom.h> #include <linux/oom.h>
@ -124,9 +123,12 @@ static struct sysrq_key_op sysrq_unraw_op = {
static void sysrq_handle_crash(int key, struct tty_struct *tty) static void sysrq_handle_crash(int key, struct tty_struct *tty)
{ {
char *killer = NULL; char *killer = NULL;
panic_on_oops = 1; /* force panic */
wmb();
*killer = 1; *killer = 1;
} }
static struct sysrq_key_op sysrq_crashdump_op = { static struct sysrq_key_op sysrq_crash_op = {
.handler = sysrq_handle_crash, .handler = sysrq_handle_crash,
.help_msg = "Crash", .help_msg = "Crash",
.action_msg = "Trigger a crash", .action_msg = "Trigger a crash",
@ -401,7 +403,7 @@ static struct sysrq_key_op *sysrq_key_table[36] = {
*/ */
NULL, /* a */ NULL, /* a */
&sysrq_reboot_op, /* b */ &sysrq_reboot_op, /* b */
&sysrq_crashdump_op, /* c & ibm_emac driver debug */ &sysrq_crash_op, /* c & ibm_emac driver debug */
&sysrq_showlocks_op, /* d */ &sysrq_showlocks_op, /* d */
&sysrq_term_op, /* e */ &sysrq_term_op, /* e */
&sysrq_moom_op, /* f */ &sysrq_moom_op, /* f */