diff options
author | Corey Minyard <minyard@acm.org> | 2006-06-28 07:26:55 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@g5.osdl.org> | 2006-06-28 17:59:06 -0400 |
commit | 96febe9fb7b04f2a078882d08bd6a997dee7cfa3 (patch) | |
tree | 92f587109a90f142201748670ccf857a7af10135 /drivers | |
parent | 1a245866f8a417250c0f82b16f7a6dcf0b812f58 (diff) |
[PATCH] IPMI: watchdog handle panic properly
Modify the watchdog timeout in IPMI to only do things at panic/reboot time if
the watchdog timer was already running. Some BIOSes do not disable the
watchdog timer at startup, and this led to a reboot a while later if the new
OS running didn't start monitoring the watchdog, even if the watchdog was not
running before.
Signed-off-by: Corey Minyard <minyard@acm.org>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/char/ipmi/ipmi_watchdog.c | 18 |
1 files changed, 10 insertions, 8 deletions
diff --git a/drivers/char/ipmi/ipmi_watchdog.c b/drivers/char/ipmi/ipmi_watchdog.c index 8f8867170973..1a0a19c53605 100644 --- a/drivers/char/ipmi/ipmi_watchdog.c +++ b/drivers/char/ipmi/ipmi_watchdog.c | |||
@@ -949,9 +949,10 @@ static int wdog_reboot_handler(struct notifier_block *this, | |||
949 | /* Disable the WDT if we are shutting down. */ | 949 | /* Disable the WDT if we are shutting down. */ |
950 | ipmi_watchdog_state = WDOG_TIMEOUT_NONE; | 950 | ipmi_watchdog_state = WDOG_TIMEOUT_NONE; |
951 | panic_halt_ipmi_set_timeout(); | 951 | panic_halt_ipmi_set_timeout(); |
952 | } else { | 952 | } else if (ipmi_watchdog_state != WDOG_TIMEOUT_NONE) { |
953 | /* Set a long timer to let the reboot happens, but | 953 | /* Set a long timer to let the reboot happens, but |
954 | reboot if it hangs. */ | 954 | reboot if it hangs, but only if the watchdog |
955 | timer was already running. */ | ||
955 | timeout = 120; | 956 | timeout = 120; |
956 | pretimeout = 0; | 957 | pretimeout = 0; |
957 | ipmi_watchdog_state = WDOG_TIMEOUT_RESET; | 958 | ipmi_watchdog_state = WDOG_TIMEOUT_RESET; |
@@ -973,16 +974,17 @@ static int wdog_panic_handler(struct notifier_block *this, | |||
973 | { | 974 | { |
974 | static int panic_event_handled = 0; | 975 | static int panic_event_handled = 0; |
975 | 976 | ||
976 | /* On a panic, if we have a panic timeout, make sure that the thing | 977 | /* On a panic, if we have a panic timeout, make sure to extend |
977 | reboots, even if it hangs during that panic. */ | 978 | the watchdog timer to a reasonable value to complete the |
978 | if (watchdog_user && !panic_event_handled) { | 979 | panic, if the watchdog timer is running. Plus the |
979 | /* Make sure the panic doesn't hang, and make sure we | 980 | pretimeout is meaningless at panic time. */ |
980 | do this only once. */ | 981 | if (watchdog_user && !panic_event_handled && |
982 | ipmi_watchdog_state != WDOG_TIMEOUT_NONE) { | ||
983 | /* Make sure we do this only once. */ | ||
981 | panic_event_handled = 1; | 984 | panic_event_handled = 1; |
982 | 985 | ||
983 | timeout = 255; | 986 | timeout = 255; |
984 | pretimeout = 0; | 987 | pretimeout = 0; |
985 | ipmi_watchdog_state = WDOG_TIMEOUT_RESET; | ||
986 | panic_halt_ipmi_set_timeout(); | 988 | panic_halt_ipmi_set_timeout(); |
987 | } | 989 | } |
988 | 990 | ||