diff options
| author | Robert Watson <rwatson@FreeBSD.org> | 2003-10-03 18:27:24 +0000 |
|---|---|---|
| committer | Robert Watson <rwatson@FreeBSD.org> | 2003-10-03 18:27:24 +0000 |
| commit | 5fd04e380fadccd5b9458a5442f04cc9f40bbcdc (patch) | |
| tree | f5fe007e6a11bbf25780876aa8db6449a6981b22 /sys/net | |
| parent | aea8b30f12f5005bae5723fbbcaa606f4a0ac486 (diff) | |
Notes
Diffstat (limited to 'sys/net')
| -rw-r--r-- | sys/net/netisr.c | 34 |
1 files changed, 21 insertions, 13 deletions
diff --git a/sys/net/netisr.c b/sys/net/netisr.c index d7fc4ec49fd9..347fd9a0c94e 100644 --- a/sys/net/netisr.c +++ b/sys/net/netisr.c @@ -100,7 +100,6 @@ struct isrstat { 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 */ }; @@ -119,14 +118,30 @@ SYSCTL_INT(_net_isr, OID_AUTO, directed, CTLFLAG_RD, &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, &isrstat.isrs_swi_count, 0, ""); /* + * Process all packets currently present in a netisr queue. Used to + * drain an existing set of packets waiting for processing when we + * begin direct dispatch, to avoid processing packets out of order. + */ +static void +netisr_processqueue(struct netisr *ni) +{ + struct mbuf *m; + + for (;;) { + IF_DEQUEUE(ni->ni_queue, m); + if (m == NULL) + break; + ni->ni_handler(m); + } +} + +/* * Call the netisr directly instead of queueing the packet, if possible. * * Ideally, the permissibility of calling the routine would be determined @@ -163,10 +178,9 @@ netisr_dispatch(int num, struct mbuf *m) * 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++; + netisr_processqueue(ni); ni->ni_handler(m); mtx_unlock(&netisr_mtx); } else { @@ -204,7 +218,6 @@ static void swi_net(void *dummy) { struct netisr *ni; - struct mbuf *m; u_int bits; int i; #ifdef DEVICE_POLLING @@ -230,12 +243,7 @@ swi_net(void *dummy) 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); - } + netisr_processqueue(ni); } } while (polling); mtx_unlock(&netisr_mtx); |
