aboutsummaryrefslogtreecommitdiff
path: root/sys/dev/ixgbe
diff options
context:
space:
mode:
authorJack F Vogel <jfv@FreeBSD.org>2012-11-30 23:54:57 +0000
committerJack F Vogel <jfv@FreeBSD.org>2012-11-30 23:54:57 +0000
commitdf51baf38fbfca7b2402be3f0468e7b40b942f77 (patch)
treefaa74266e9cb4a7faf64eb5bf9f9d00408dcc2f6 /sys/dev/ixgbe
parent5ba651f00489791d21b1831cf7101c76fb3b3ae6 (diff)
downloadsrc-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.c47
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 */