diff -uNarp linux-2.6.9/arch/i386/kernel/traps.c linux-2.6.9.new/arch/i386/kernel/traps.c
--- linux-2.6.9/arch/i386/kernel/traps.c	2009-05-18 15:37:18.233035000 -0700
+++ linux-2.6.9.new/arch/i386/kernel/traps.c	2009-05-18 16:15:17.212124000 -0700
@@ -301,6 +301,7 @@ void die(const char * str, struct pt_reg
 		.lock_owner_depth =	0
 	};
 	static int die_counter;
+	extern int netpoll_enable;
 
 	if (die.lock_owner != smp_processor_id()) {
 		console_verbose();
@@ -312,6 +313,7 @@ void die(const char * str, struct pt_reg
 
 	if (++die.lock_owner_depth < 3) {
 		int nl = 0;
+		struct task_struct *tsk = current;
 		handle_BUG(regs);
 		printk(KERN_ALERT "%s: %04lx [#%d]\n", str, err & 0xffff, ++die_counter);
 #ifdef CONFIG_PREEMPT
@@ -329,6 +331,8 @@ void die(const char * str, struct pt_reg
 		if (nl)
 			printk("\n");
 	notify_die(DIE_OOPS, (char *)str, regs, err, 255, SIGSEGV);
+		if (in_interrupt() || !tsk->pid || (tsk->pid == 1) || panic_on_oops)
+			netpoll_enable = 1;
 		show_registers(regs);
 		try_crashdump(regs);
   	} else
diff -uNarp linux-2.6.9/arch/x86_64/kernel/traps.c linux-2.6.9.new/arch/x86_64/kernel/traps.c
--- linux-2.6.9/arch/x86_64/kernel/traps.c	2009-05-18 15:37:13.287248000 -0700
+++ linux-2.6.9.new/arch/x86_64/kernel/traps.c	2009-05-18 16:15:17.217122000 -0700
@@ -358,6 +358,8 @@ void oops_end(void)
 void __die(const char * str, struct pt_regs * regs, long err)
 {
 	static int die_counter;
+	struct task_struct *tsk = current;
+	extern int netpoll_enable;
 	printk(KERN_EMERG "%s: %04lx [%u] ", str, err & 0xffff,++die_counter);
 #ifdef CONFIG_PREEMPT
 	printk("PREEMPT ");
@@ -370,6 +372,8 @@ void __die(const char * str, struct pt_r
 #endif
 	printk("\n");
 	notify_die(DIE_OOPS, (char *)str, regs, err, 255, SIGSEGV);
+	if (in_interrupt() || !tsk->pid || (tsk->pid == 1) || panic_on_oops)
+		netpoll_enable = 1;
 	show_registers(regs);
 	/* Executive summary in case the oops scrolled away */
 	printk(KERN_ALERT "RIP ");
diff -uNarp linux-2.6.9/kernel/panic.c linux-2.6.9.new/kernel/panic.c
--- linux-2.6.9/kernel/panic.c	2009-05-18 15:37:19.529948000 -0700
+++ linux-2.6.9.new/kernel/panic.c	2009-05-18 16:15:17.227124000 -0700
@@ -67,7 +67,9 @@ NORET_TYPE void panic(const char * fmt, 
 #if defined(CONFIG_ARCH_S390)
         unsigned long caller = (unsigned long) __builtin_return_address(0);
 #endif
+	extern int netpoll_enable;
 
+	netpoll_enable = 1;
 	bust_spinlocks(1);
 	va_start(args, fmt);
 	vsnprintf(buf, sizeof(buf), fmt, args);
diff -uNarp linux-2.6.9/net/core/netpoll.c linux-2.6.9.new/net/core/netpoll.c
--- linux-2.6.9/net/core/netpoll.c	2009-05-18 15:37:23.468775000 -0700
+++ linux-2.6.9.new/net/core/netpoll.c	2009-05-18 16:15:17.223122000 -0700
@@ -151,6 +151,7 @@ static void service_arp_queue(struct net
 	return;
 }
 
+int netpoll_enable = 0;
 void netpoll_poll_dev(struct net_device *dev)
 {
 	struct netpoll_info *npi = dev_wrapper(dev)->npinfo;
@@ -159,9 +160,11 @@ void netpoll_poll_dev(struct net_device 
 		return;
 
 	/* Process pending work on NIC */
-	dev->poll_controller(dev);
-	if (dev->poll)
-		poll_napi(dev);
+	if (unlikely(netpoll_enable || netdump_mode)) {
+		dev->poll_controller(dev);
+		if (dev->poll)
+			poll_napi(dev);
+	}
 
 	service_arp_queue(npi);
 
@@ -889,3 +892,4 @@ EXPORT_SYMBOL(netpoll_send_udp);
 EXPORT_SYMBOL(netpoll_poll);
 EXPORT_SYMBOL(netpoll_poll_dev);
 EXPORT_SYMBOL_GPL(netpoll_reset_locks);
+EXPORT_SYMBOL_GPL(netpoll_enable);
