Module Name: src
Committed By: mrg
Date: Sun Apr 11 02:02:14 UTC 2010
Modified Files:
src/sys/dev/pci: if_iwn.c
Log Message:
avoid rbuf starvation. when grabbing a recieve buffer, if a local
4KB buffer isn't available, try to MEXTMALLOC() one. only if both
of these fail to we abort the recieve operation.
based on a patch from Sverre Froyen <[email protected]>, thanks!
tested by myself, sverre and jeremy reed.
To generate a diff of this commit:
cvs rdiff -u -r1.38 -r1.39 src/sys/dev/pci/if_iwn.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/dev/pci/if_iwn.c
diff -u src/sys/dev/pci/if_iwn.c:1.38 src/sys/dev/pci/if_iwn.c:1.39
--- src/sys/dev/pci/if_iwn.c:1.38 Mon Apr 5 07:20:26 2010
+++ src/sys/dev/pci/if_iwn.c Sun Apr 11 02:02:14 2010
@@ -1,4 +1,4 @@
-/* $NetBSD: if_iwn.c,v 1.38 2010/04/05 07:20:26 joerg Exp $ */
+/* $NetBSD: if_iwn.c,v 1.39 2010/04/11 02:02:14 mrg Exp $ */
/* $OpenBSD: if_iwn.c,v 1.49 2009/03/29 21:53:52 sthen Exp $ */
/*-
@@ -23,7 +23,7 @@
* 802.11 network adapters.
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_iwn.c,v 1.38 2010/04/05 07:20:26 joerg Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_iwn.c,v 1.39 2010/04/11 02:02:14 mrg Exp $");
#include <sys/param.h>
@@ -1930,8 +1930,8 @@
}
/*
- * See comment in if_wpi.c:wpi_rx_intr() about locking
- * nb_free_entries here. In short: it's not required.
+ * Try to grab a local 4KB buffer. If it fails, try to
+ * MEXTMALLOC() next, and if that fails, give up.
*/
MGETHDR(m1, M_DONTWAIT, MT_DATA);
if (m1 == NULL) {
@@ -1939,17 +1939,21 @@
ifp->if_ierrors++;
return;
}
- if (sc->rxq.nb_free_entries <= 0) {
- ic->ic_stats.is_rx_nobuf++;
- ifp->if_ierrors++;
- m_freem(m1);
- return;
+ if ((rbuf = iwn_alloc_rbuf(sc)) == NULL) {
+ MEXTMALLOC(m1, IWN_RBUF_SIZE, M_DONTWAIT);
+ if (!(m1->m_flags & M_EXT)) {
+ ic->ic_stats.is_rx_nobuf++;
+ ifp->if_ierrors++;
+ m_freem(m1);
+ return;
+ }
+ } else {
+ /* Attach RX buffer to mbuf header. */
+ MEXTADD(m1, rbuf->vaddr, IWN_RBUF_SIZE, 0, iwn_free_rbuf,
+ rbuf);
+ m1->m_flags |= M_EXT_RW;
}
- rbuf = iwn_alloc_rbuf(sc);
- /* Attach RX buffer to mbuf header. */
- MEXTADD(m1, rbuf->vaddr, IWN_RBUF_SIZE, 0, iwn_free_rbuf,
- rbuf);
- m1->m_flags |= M_EXT_RW;
+
bus_dmamap_unload(sc->sc_dmat, data->map);
error = bus_dmamap_load(sc->sc_dmat, data->map, m1->m_ext.ext_buf,