Index: netisr.c =================================================================== RCS file: /home/ncvs/src/sys/net/netisr.c,v retrieving revision 1.4 diff -u -r1.4 netisr.c --- netisr.c 1 Oct 2003 21:31:09 -0000 1.4 +++ netisr.c 1 Oct 2003 21:42:33 -0000 @@ -63,6 +63,8 @@ static struct mtx netisr_mtx; static void *net_ih; +static void swi_processqueue(struct netisr *ni); + void legacy_setsoftnet(void) { @@ -100,7 +102,6 @@ int isrs_count; /* dispatch count */ int isrs_directed; /* ...successfully dispatched */ int isrs_deferred; /* ...queued instead */ - int isrs_bypassed; /* bypassed queued packets */ int isrs_queued; /* intentionally queueued */ int isrs_swi_count; /* swi_net handlers called */ }; @@ -118,8 +119,6 @@ &isrstat.isrs_directed, 0, ""); SYSCTL_INT(_net_isr, OID_AUTO, deferred, CTLFLAG_RD, &isrstat.isrs_deferred, 0, ""); -SYSCTL_INT(_net_isr, OID_AUTO, bypassed, CTLFLAG_RD, - &isrstat.isrs_bypassed, 0, ""); SYSCTL_INT(_net_isr, OID_AUTO, queued, CTLFLAG_RD, &isrstat.isrs_queued, 0, ""); SYSCTL_INT(_net_isr, OID_AUTO, swi_count, CTLFLAG_RD, @@ -162,10 +161,9 @@ * b. fallback to queueing the packet, * c. sweep the issue under the rug and ignore it. * - * Currently, we do c), and keep a rough event counter. + * Currently, we do a). Previously we did c). */ - if (_IF_QLEN(ni->ni_queue) > 0) - isrstat.isrs_bypassed++; + swi_drainqueue(ni); ni->ni_handler(m); mtx_unlock(&netisr_mtx); } else { @@ -200,6 +198,19 @@ } static void +swi_processqueue(struct netisr *ni) +{ + struct mbuf *m; + + for (;;) { + IF_DEQUEUE(ni->ni_queue, m); + if (m == NULL) + break; + ni->ni_handler(m); + } +} + +static void swi_net(void *dummy) { struct netisr *ni; @@ -229,12 +240,7 @@ if (ni->ni_queue == NULL) ni->ni_handler(NULL); else - for (;;) { - IF_DEQUEUE(ni->ni_queue, m); - if (m == NULL) - break; - ni->ni_handler(m); - } + swi_processqueue(ni); } } while (polling); mtx_unlock(&netisr_mtx);