[patch] Fix some problem between kdb and kdump

Takenori Nagano t-nagano at ah.jp.nec.com
Thu May 31 00:37:59 PDT 2007


Hi,

kdb has some problem to use with kdump.
This patch fixes some of them.

1) We can't use kdb when machine panicked.

crash_kexec() is called before notifier_call_chain(&panic_notifier_chain).
This patch makes KDB_ENTER() is called before crash_kexec().

2) We can't take a kdump when KDB_FLAG is set CATASTROPHIC.

kdb_do_dump() does not support kdump.
This patch makes machine_kexec() is called from kdb_do_dump().


diff -uprN linux-2.6.22-rc3.orig/kdb/kdbmain.c linux-2.6.22-rc3/kdb/kdbmain.c
--- linux-2.6.22-rc3.orig/kdb/kdbmain.c	2007-05-31 15:08:40.296000000 +0900
+++ linux-2.6.22-rc3/kdb/kdbmain.c	2007-05-31 15:18:52.172000000 +0900
@@ -36,6 +36,9 @@
 #include <linux/nmi.h>
 #include <linux/ptrace.h>
 #include <linux/sysctl.h>
+#ifdef CONFIG_KEXEC
+#include <linux/kexec.h>
+#endif
 #if defined(CONFIG_LKCD_DUMP) || defined(CONFIG_LKCD_DUMP_MODULE)
 #include <linux/dump.h>
 #endif
@@ -1089,6 +1092,21 @@ handle_ctrl_cmd(char *cmd)
 static void
 kdb_do_dump(void)
 {
+#ifdef CONFIG_KEXEC
+#ifdef CONFIG_IA64
+	if (ia64_kimage) {
+		kexec_disable_iosapic();
+		machine_kexec(ia64_kimage);
+	}
+#else
+	if (kexec_crash_image) {
+#ifdef CONFIG_X86_IO_APIC
+		disable_IO_APIC();
+#endif /* CONFIG_X86_IO_APIC */
+		machine_kexec(kexec_crash_image);
+	}
+#endif /* CONFIG_IA64 */
+#endif /* CONFIG_KEXEC */
 #if defined(CONFIG_LKCD_DUMP) || defined(CONFIG_LKCD_DUMP_MODULE)
 	kdb_printf("Forcing dump (if configured)\n");
 	console_loglevel = 8;	/* to see the dump messages */
@@ -3868,35 +3886,6 @@ kdb_cmd_init(void)
 	}
 }

-/*
- * kdb_panic
- *
- *	Invoked via the panic_notifier_list.
- *
- * Inputs:
- *	None.
- * Outputs:
- *	None.
- * Returns:
- *	Zero.
- * Locking:
- *	None.
- * Remarks:
- *	When this function is called from panic(), the other cpus have already
- *	been stopped.
- *
- */
-
-static int
-kdb_panic(struct notifier_block *self, unsigned long command, void *ptr)
-{
-	KDB_FLAG_SET(CATASTROPHIC);	/* kernel state is dubious now */
-	KDB_ENTER();
-	return 0;
-}
-
-static struct notifier_block kdb_block = { kdb_panic, NULL, 0 };
-
 #ifdef	CONFIG_SYSCTL
 static int proc_do_kdb(ctl_table *table, int write, struct file *filp,
 		       void __user *buffer, size_t *lenp, loff_t *ppos)
@@ -3989,7 +3978,6 @@ kdb_init(void)
 	kdb_initial_cpu = -1;	/* Avoid recursion problems */
 	kdb(KDB_REASON_CPU_UP, 0, NULL);	/* do kdb setup on boot cpu */
 	kdb_initial_cpu = smp_processor_id();
-	atomic_notifier_chain_register(&panic_notifier_list, &kdb_block);
 	register_cpu_notifier(&kdb_cpu_nfb);

 #ifdef kdba_setjmp
diff -uprN linux-2.6.22-rc3.orig/kernel/panic.c linux-2.6.22-rc3/kernel/panic.c
--- linux-2.6.22-rc3.orig/kernel/panic.c	2007-05-26 11:55:14.000000000 +0900
+++ linux-2.6.22-rc3/kernel/panic.c	2007-05-31 15:20:41.712000000 +0900
@@ -19,6 +19,10 @@
 #include <linux/nmi.h>
 #include <linux/kexec.h>
 #include <linux/debug_locks.h>
+#ifdef CONFIG_KDB
+#include <linux/kdb.h>
+#include <linux/kdbprivate.h>
+#endif

 int panic_on_oops;
 int tainted;
@@ -80,6 +84,11 @@ NORET_TYPE void panic(const char * fmt,
 	printk(KERN_EMERG "Kernel panic - not syncing: %s\n",buf);
 	bust_spinlocks(0);

+#ifdef CONFIG_KDB
+	KDB_FLAG_SET(CATASTROPHIC);
+	KDB_ENTER()
+#endif
+
 	/*
 	 * If we have crashed and we have a crash kernel loaded let it handle
 	 * everything else.
---------------------------
Use http://oss.sgi.com/ecartis to modify your settings or to unsubscribe.


More information about the kdb mailing list