diff options
author | Jack F Vogel <jfv@FreeBSD.org> | 2012-11-30 23:54:57 +0000 |
---|---|---|
committer | Jack F Vogel <jfv@FreeBSD.org> | 2012-11-30 23:54:57 +0000 |
commit | df51baf38fbfca7b2402be3f0468e7b40b942f77 (patch) | |
tree | faa74266e9cb4a7faf64eb5bf9f9d00408dcc2f6 /sys/dev/ixgbe | |
parent | 5ba651f00489791d21b1831cf7101c76fb3b3ae6 (diff) | |
download | src-df51baf38fbfca7b2402be3f0468e7b40b942f77.tar.gz src-df51baf38fbfca7b2402be3f0468e7b40b942f77.zip |
Patch #9 Performance - improve the tx dma failure
path, similar to a change done in igb long ago.
Notes
Notes:
svn path=/head/; revision=243733
Diffstat (limited to 'sys/dev/ixgbe')
-rw-r--r-- | sys/dev/ixgbe/ixgbe.c | 47 |
1 files changed, 22 insertions, 25 deletions
diff --git a/sys/dev/ixgbe/ixgbe.c b/sys/dev/ixgbe/ixgbe.c index 04b02d687028..1745e9ff8d7d 100644 --- a/sys/dev/ixgbe/ixgbe.c +++ b/sys/dev/ixgbe/ixgbe.c @@ -47,7 +47,7 @@ int ixgbe_display_debug_stats = 0; /********************************************************************* * Driver version *********************************************************************/ -char ixgbe_driver_version[] = "2.5.0 - 8"; +char ixgbe_driver_version[] = "2.5.0 - 9"; /********************************************************************* * PCI Device ID Table @@ -1740,6 +1740,7 @@ ixgbe_xmit(struct tx_ring *txr, struct mbuf **m_headp) u32 paylen = 0; int i, j, error, nsegs; int first, last = 0; + bool remap = TRUE; struct mbuf *m_head; bus_dma_segment_t segs[adapter->num_segs]; bus_dmamap_t map; @@ -1767,42 +1768,38 @@ ixgbe_xmit(struct tx_ring *txr, struct mbuf **m_headp) /* * Map the packet for DMA. */ +retry: error = bus_dmamap_load_mbuf_sg(txr->txtag, map, *m_headp, segs, &nsegs, BUS_DMA_NOWAIT); - if (error == EFBIG) { + if (__predict_false(error)) { struct mbuf *m; - m = m_defrag(*m_headp, M_DONTWAIT); - if (m == NULL) { - adapter->mbuf_defrag_failed++; - m_freem(*m_headp); - *m_headp = NULL; - return (ENOBUFS); - } - *m_headp = m; - - /* Try it again */ - error = bus_dmamap_load_mbuf_sg(txr->txtag, map, - *m_headp, segs, &nsegs, BUS_DMA_NOWAIT); - - if (error == ENOMEM) { + switch (error) { + case EFBIG: + /* Try it again? - one try */ + if (remap == TRUE) { + remap = FALSE; + m = m_defrag(*m_headp, M_NOWAIT); + if (m == NULL) { + adapter->mbuf_defrag_failed++; + m_freem(*m_headp); + *m_headp = NULL; + return (ENOBUFS); + } + *m_headp = m; + goto retry; + } else + return (error); + case ENOMEM: txr->no_tx_dma_setup++; return (error); - } else if (error != 0) { + default: txr->no_tx_dma_setup++; m_freem(*m_headp); *m_headp = NULL; return (error); } - } else if (error == ENOMEM) { - txr->no_tx_dma_setup++; - return (error); - } else if (error != 0) { - txr->no_tx_dma_setup++; - m_freem(*m_headp); - *m_headp = NULL; - return (error); } /* Make certain there are enough descriptors */ |