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) (®s->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);