From: Bodo Eggert <7eggert@gmx.de>
To: linux-kernel@vger.kernel.org
Subject: [PATCH] Introduce softpanic
Date: Fri, 25 Jan 2008 15:54:42 +0100 (CET) [thread overview]
Message-ID: <alpine.LSU.0.999.0801251551060.21522@be1.lrz> (raw)
Enabling this option changes a hard panic on boot errors to a
soft panic, which does not stop the system completely.
You can still scroll the screen and read the messages.
Signed-Off-By: Bodo Eggert <7eggert@gmx.de>
diff -pruN -X dontdiff linux-2.6.24.pure/include/linux/kernel.h linux-2.6.24.softpanic/include/linux/kernel.h
--- linux-2.6.24.pure/include/linux/kernel.h 2008-01-25 15:09:36.000000000 +0100
+++ linux-2.6.24.softpanic/include/linux/kernel.h 2008-01-25 15:31:26.000000000 +0100
@@ -130,6 +130,12 @@ extern struct atomic_notifier_head panic
extern long (*panic_blink)(long time);
NORET_TYPE void panic(const char * fmt, ...)
__attribute__ ((NORET_AND format (printf, 1, 2))) __cold;
+#ifdef SOFTPANIC
+NORET_TYPE void softpanic(const char *fmt, ...)
+ __attribute__ ((NORET_AND format (printf, 1, 2))) __cold;
+#else
+# define softpanic(...) do { panic(__VA_ARGS__); } while (0)
+#endif
extern void oops_enter(void);
extern void oops_exit(void);
extern int oops_may_print(void);
diff -pruN -X dontdiff linux-2.6.24.pure/init/Kconfig linux-2.6.24.softpanic/init/Kconfig
--- linux-2.6.24.pure/init/Kconfig 2008-01-25 15:09:38.000000000 +0100
+++ linux-2.6.24.softpanic/init/Kconfig 2008-01-25 15:15:08.000000000 +0100
@@ -526,6 +526,14 @@ config BUG
option for embedded systems with no facilities for reporting errors.
Just say Y.
+config SOFTPANIC
+ bool "Enable softpanic for boot errors" if EMBEDDED
+ default y
+ help
+ Enabling this option changes a hard panic on boot errors to a
+ soft panic, which does not stop the system completely.
+ You can still scroll the screen and read the messages.
+
config ELF_CORE
default y
bool "Enable ELF core dumps" if EMBEDDED
diff -pruN -X dontdiff linux-2.6.24.pure/init/do_mounts.c linux-2.6.24.softpanic/init/do_mounts.c
--- linux-2.6.24.pure/init/do_mounts.c 2008-01-25 15:08:31.000000000 +0100
+++ linux-2.6.24.softpanic/init/do_mounts.c 2008-01-25 15:15:08.000000000 +0100
@@ -330,7 +330,7 @@ retry:
printk("Please append a correct \"root=\" boot option; here are the available partitions:\n");
printk_all_partitions();
- panic("VFS: Unable to mount root fs on %s", b);
+ softpanic("VFS: Unable to mount root fs on %s", b);
}
printk("List of all partitions:\n");
@@ -342,7 +342,7 @@ retry:
#ifdef CONFIG_BLOCK
__bdevname(ROOT_DEV, b);
#endif
- panic("VFS: Unable to mount root fs on %s", b);
+ softpanic("VFS: Unable to mount root fs on %s", b);
out:
putname(fs_names);
}
diff -pruN -X dontdiff linux-2.6.24.pure/init/main.c linux-2.6.24.softpanic/init/main.c
--- linux-2.6.24.pure/init/main.c 2008-01-25 15:09:38.000000000 +0100
+++ linux-2.6.24.softpanic/init/main.c 2008-01-25 15:15:08.000000000 +0100
@@ -585,7 +585,7 @@ asmlinkage void __init start_kernel(void
*/
console_init();
if (panic_later)
- panic(panic_later, panic_param);
+ softpanic(panic_later, panic_param);
lockdep_info();
@@ -800,7 +800,7 @@ static int noinline init_post(void)
run_init_process("/bin/init");
run_init_process("/bin/sh");
- panic("No init found. Try passing init= option to kernel.");
+ softpanic("No init found. Try passing init= option to kernel.");
}
static int __init kernel_init(void * unused)
diff -pruN -X dontdiff linux-2.6.24.pure/kernel/panic.c linux-2.6.24.softpanic/kernel/panic.c
--- linux-2.6.24.pure/kernel/panic.c 2008-01-25 15:09:38.000000000 +0100
+++ linux-2.6.24.softpanic/kernel/panic.c 2008-01-25 15:38:52.000000000 +0100
@@ -142,6 +142,66 @@ NORET_TYPE void panic(const char * fmt,
EXPORT_SYMBOL(panic);
+#ifdef SOFTPANIC
+NORET_TYPE void softpanic(const char *fmt, ...)
+{
+ long i;
+ static char buf[1024];
+ va_list args;
+#if defined(CONFIG_S390)
+ unsigned long caller = (unsigned long) __builtin_return_address(0);
+#endif
+
+ va_start(args, fmt);
+ vsnprintf(buf, sizeof(buf), fmt, args);
+ va_end(args);
+ printk(KERN_EMERG "Kernel panic - not syncing: %s\n", buf);
+
+ atomic_notifier_call_chain(&panic_notifier_list, 0, buf);
+
+ if (!panic_blink)
+ panic_blink = no_blink;
+
+ if (panic_timeout > 0) {
+ /*
+ * Delay timeout seconds before rebooting the machine.
+ * We can't use the "normal" timers since we just panicked..
+ */
+ printk(KERN_EMERG "Rebooting in %d seconds..", panic_timeout);
+ for (i = 0; i < panic_timeout*1000; ) {
+ touch_nmi_watchdog();
+ i += panic_blink(i);
+ mdelay(1);
+ i++;
+ }
+ /* This will not be a clean reboot, with everything
+ * shutting down. But if there is a chance of
+ * rebooting the system it will be rebooted.
+ */
+ kernel_restart(NULL);
+ }
+#ifdef __sparc__
+ {
+ extern int stop_a_enabled;
+ /* Make sure the user can actually press Stop-A (L1-A) */
+ stop_a_enabled = 1;
+ printk(KERN_EMERG
+ "Press Stop-A (L1-A) to return to the boot prom\n");
+ }
+#endif
+#if defined(CONFIG_S390)
+ disabled_wait(caller);
+#endif
+ for (i = 0;;) {
+ touch_softlockup_watchdog();
+ i += panic_blink(i);
+ msleep(1);
+ i++;
+ }
+}
+EXPORT_SYMBOL(softpanic);
+#endif
+
/**
* print_tainted - return a string to represent the kernel taint state.
*
--
Top 100 things you don't want the sysadmin to say:
21. where did you say those backup tapes were kept?
next reply other threads:[~2008-01-25 14:54 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-01-25 14:54 Bodo Eggert [this message]
2008-01-25 15:01 ` Andi Kleen
2008-01-25 15:22 ` Jan Engelhardt
2008-01-25 17:31 ` Bodo Eggert
2008-02-02 14:15 ` Pavel Machek
2008-01-25 15:21 ` Jan Engelhardt
2008-01-25 17:37 ` Bodo Eggert
2008-01-28 19:07 ` [PATCH] Introduce softpanic V.2 Bodo Eggert
2008-01-25 15:26 ` [PATCH] Introduce softpanic Jiri Kosina
2008-01-25 17:16 ` Valdis.Kletnieks
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=alpine.LSU.0.999.0801251551060.21522@be1.lrz \
--to=7eggert@gmx.de \
--cc=linux-kernel@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®