Index: net/netisr.c =================================================================== RCS file: /cvs/src/sys/net/netisr.c,v retrieving revision 1.8 diff -u -p -r1.8 netisr.c --- net/netisr.c 3 Dec 2015 12:22:51 -0000 1.8 +++ net/netisr.c 5 Dec 2015 11:21:49 -0000 @@ -15,11 +15,11 @@ */ #include #include +#include +#include #include -#include - #include "ether.h" #include "ppp.h" #include "bridge.h" @@ -28,13 +28,15 @@ void netintr(void *); -int netisr; -void *netisr_intr; +unsigned int netisr; void netintr(void *unused) /* ARGSUSED */ { int n, t = 0; + int s; + + s = splsoftnet(); while ((n = netisr) != 0) { atomic_clearbits_int(&netisr, n); @@ -68,12 +70,19 @@ netintr(void *unused) /* ARGSUSED */ if (t & (1 << NETISR_PFSYNC)) pfsyncintr(); #endif + splx(s); } +struct task nettask = TASK_INITIALIZER(netintr, NULL); + void netisr_init(void) { - netisr_intr = softintr_establish(IPL_SOFTNET, netintr, NULL); - if (netisr_intr == NULL) - panic("can't establish softnet handler"); +} + +void +schednetisr(unsigned int isr) +{ + atomic_setbits_int(&netisr, (1 << (isr))); + task_add(systq, &nettask); } Index: net/netisr.h =================================================================== RCS file: /cvs/src/sys/net/netisr.h,v retrieving revision 1.43 diff -u -p -r1.43 netisr.h --- net/netisr.h 3 Dec 2015 12:27:33 -0000 1.43 +++ net/netisr.h 5 Dec 2015 11:21:49 -0000 @@ -62,8 +62,6 @@ #ifndef _LOCORE #ifdef _KERNEL -extern int netisr; /* scheduling bits for network */ - void arpintr(void); void ipintr(void); void ip6intr(void); @@ -72,16 +70,8 @@ void bridgeintr(void); void pppoeintr(void); void pfsyncintr(void); -#include - -extern void *netisr_intr; -#define schednetisr(anisr) \ -do { \ - atomic_setbits_int(&netisr, (1 << (anisr))); \ - softintr_schedule(netisr_intr); \ -} while (/* CONSTCOND */0) - void netisr_init(void); +void schednetisr(unsigned int); #endif /* _KERNEL */ #endif /*_LOCORE */ Index: netinet/ip_input.c =================================================================== RCS file: /cvs/src/sys/netinet/ip_input.c,v retrieving revision 1.263 diff -u -p -r1.263 ip_input.c --- netinet/ip_input.c 2 Dec 2015 13:29:26 -0000 1.263 +++ netinet/ip_input.c 5 Dec 2015 11:21:49 -0000 @@ -191,13 +191,11 @@ struct route ipforward_rt; void ipintr(void) { + struct mbuf_list ml; struct mbuf *m; - /* - * Get next datagram off input queue and get IP header - * in first mbuf. - */ - while ((m = niq_dequeue(&ipintrq)) != NULL) { + niq_delist(&ipintrq, &ml); + while ((m = ml_dequeue(&ml)) != NULL) { #ifdef DIAGNOSTIC if ((m->m_flags & M_PKTHDR) == 0) panic("ipintr no HDR");