PERFORCE change 109417 for review
Sam Leffler
sam at FreeBSD.org
Tue Nov 7 05:24:59 UTC 2006
http://perforce.freebsd.org/chv.cgi?CH=109417
Change 109417 by sam at sam_ebb on 2006/11/07 05:24:12
replace m_defrag with private code for a small speedup
Affected files ...
.. //depot/projects/arm/src/sys/arm/xscale/ixp425/if_npe.c#8 edit
Differences ...
==== //depot/projects/arm/src/sys/arm/xscale/ixp425/if_npe.c#8 (text+ko) ====
@@ -982,6 +982,29 @@
NPE_UNLOCK(sc);
}
+static struct mbuf *
+npe_linearize(struct mbuf *m0, int how)
+{
+ struct mbuf *m, *n;
+
+ if (m0->m_pkthdr.len > MHLEN)
+ n = m_getcl(how, MT_DATA, M_PKTHDR);
+ else
+ n = m_gethdr(how, MT_DATA);
+ if (n != NULL) {
+ n->m_len = 0; /* NB: not initialized on alloc */
+ for (m = m0; m != NULL; m = m->m_next) {
+ bcopy(mtod(m, void *), mtod(n, char *) + n->m_len,
+ m->m_len);
+ n->m_len += m->m_len;
+ }
+ /* NB: this works because we never change m_final->m_data */
+ m_move_pkthdr(n, m0);
+ }
+ m_freem(m0);
+ return n;
+}
+
/*
* dequeu packets and transmit
*/
@@ -990,7 +1013,7 @@
{
struct npe_softc *sc = ifp->if_softc;
struct npebuf *npe;
- struct mbuf *m, *mdefrag;
+ struct mbuf *m;
struct npedma *dma = &sc->txdma;
bus_dma_segment_t segs[1];
int nseg, len;
@@ -1007,16 +1030,14 @@
ifp->if_drv_flags &= ~IFF_DRV_OACTIVE;
return;
}
- mdefrag = m_defrag(m, M_DONTWAIT);
- if (mdefrag == NULL) {
- /* XXX not a good idea */
- IFQ_DRV_PREPEND(&ifp->if_snd, m);
- return;
+ npe = sc->tx_free;
+ if (m->m_next != NULL) {
+ m = npe_linearize(m, M_DONTWAIT);
+ if (m == NULL)
+ return;
}
- m = mdefrag;
- npe = sc->tx_free;
- if (bus_dmamap_load_mbuf_sg(dma->mtag, npe->ix_map, m,
- segs, &nseg, 0) != 0) {
+ if (bus_dmamap_load_mbuf_sg(dma->mtag, npe->ix_map,
+ m, segs, &nseg, 0) != 0) {
m_freem(m);
continue;
}
More information about the p4-projects
mailing list