diff -Nrup linux-2.6.18.i386.orig/arch/i386/kernel/traps.c linux-2.6.18.i386/arch/i386/kernel/traps.c
--- linux-2.6.18.i386.orig/arch/i386/kernel/traps.c	2008-05-08 23:38:15.000000000 -0700
+++ linux-2.6.18.i386/arch/i386/kernel/traps.c	2008-05-09 04:15:56.000000000 -0700
@@ -394,6 +394,7 @@ void die(const char * str, struct pt_reg
 	};
 	static int die_counter;
 	unsigned long flags;
+	extern int netpoll_enable;
 
 	oops_enter();
 
@@ -438,6 +439,8 @@ void die(const char * str, struct pt_reg
 		if (notify_die(DIE_OOPS, str, regs, err,
 					current->thread.trap_no, SIGSEGV) !=
 				NOTIFY_STOP) {
+			if (kexec_should_crash(current))
+				netpoll_enable = 1;
 			show_registers(regs);
 			/* Executive summary in case the oops scrolled away */
 			esp = (unsigned long) (&regs->esp);
diff -Nrup linux-2.6.18.i386.orig/arch/x86_64/kernel/traps.c linux-2.6.18.i386/arch/x86_64/kernel/traps.c
--- linux-2.6.18.i386.orig/arch/x86_64/kernel/traps.c	2008-05-08 23:38:15.000000000 -0700
+++ linux-2.6.18.i386/arch/x86_64/kernel/traps.c	2008-05-09 04:16:24.000000000 -0700
@@ -541,6 +541,7 @@ void __kprobes oops_end(unsigned long fl
 void __kprobes __die(const char * str, struct pt_regs * regs, long err)
 {
 	static int die_counter;
+	extern int netpoll_enable;
 	printk(KERN_EMERG "%s: %04lx [%u] ", str, err & 0xffff,++die_counter);
 #ifdef CONFIG_PREEMPT
 	printk("PREEMPT ");
@@ -556,6 +557,8 @@ void __kprobes __die(const char * str, s
 	printk(KERN_ALERT "last sysfs file: %s\n", last_sysfs_file);
 #endif
 	notify_die(DIE_OOPS, str, regs, err, current->thread.trap_no, SIGSEGV);
+	if (kexec_should_crash(current))
+		netpoll_enable = 1;
 	show_registers(regs);
 	/* Executive summary in case the oops scrolled away */
 	printk(KERN_ALERT "RIP ");
diff -Nrup linux-2.6.18.i386.orig/kernel/panic.c linux-2.6.18.i386/kernel/panic.c
--- linux-2.6.18.i386.orig/kernel/panic.c	2008-05-08 23:37:58.000000000 -0700
+++ linux-2.6.18.i386/kernel/panic.c	2008-05-09 04:15:41.000000000 -0700
@@ -65,6 +65,9 @@ NORET_TYPE void panic(const char * fmt, 
 #if defined(CONFIG_S390)
         unsigned long caller = (unsigned long) __builtin_return_address(0);
 #endif
+	extern int netpoll_enable;
+	netpoll_enable = 1;
+
 
 	/*
 	 * It's possible to come here directly from a panic-assertion and not
diff -Nrup linux-2.6.18.i386.orig/net/core/netpoll.c linux-2.6.18.i386/net/core/netpoll.c
--- linux-2.6.18.i386.orig/net/core/netpoll.c	2008-05-08 23:38:01.000000000 -0700
+++ linux-2.6.18.i386/net/core/netpoll.c	2008-05-09 04:15:25.000000000 -0700
@@ -170,15 +170,19 @@ static void service_arp_queue(struct net
 	return;
 }
 
+int netpoll_enable = 0;
+
 void netpoll_poll(struct netpoll *np)
 {
 	if(!np->dev || !netif_running(np->dev) || !np->dev->poll_controller)
 		return;
 
 	/* Process pending work on NIC */
-	np->dev->poll_controller(np->dev);
-	if (np->dev->poll)
-		poll_napi(np);
+	if (netpoll_enable) {
+		np->dev->poll_controller(np->dev);
+		if (np->dev->poll)
+			poll_napi(np);
+	}
 
 	service_arp_queue(np->dev->npinfo);
 
@@ -810,3 +814,4 @@ EXPORT_SYMBOL(netpoll_cleanup);
 EXPORT_SYMBOL(netpoll_send_udp);
 EXPORT_SYMBOL(netpoll_poll);
 EXPORT_SYMBOL(netpoll_queue);
+EXPORT_SYMBOL(netpoll_enable);
