defragment mbuf chains longer than hw segment limit before dropping

Approved by:	davidch
This commit is contained in:
edavis 2014-01-07 22:26:20 +00:00
parent 07f442b39d
commit 74e1a8fb08
2 changed files with 32 additions and 4 deletions

View File

@ -34,7 +34,7 @@
#include <sys/cdefs.h>
__FBSDID("$FreeBSD$");
#define BXE_DRIVER_VERSION "1.78.76"
#define BXE_DRIVER_VERSION "1.78.77"
#include "bxe.h"
#include "ecore_sp.h"
@ -5501,10 +5501,31 @@ bxe_tx_encap(struct bxe_fastpath *fp, struct mbuf **m_head)
fp->eth_q_stats.tx_window_violation_std++;
}
/* XXX I don't like this, change to double copy packet */
/* lets try to defragment this mbuf */
fp->eth_q_stats.mbuf_defrag_attempts++;
/* no sense trying to defrag again, just drop the frame */
rc = ENODEV;
m0 = m_defrag(*m_head, M_DONTWAIT);
if (m0 == NULL) {
fp->eth_q_stats.mbuf_defrag_failures++;
/* Ugh, just drop the frame... :( */
rc = ENOBUFS;
} else {
/* defrag successful, try mapping again */
*m_head = m0;
error = bus_dmamap_load_mbuf_sg(fp->tx_mbuf_tag,
tx_buf->m_map, m0,
segs, &nsegs, BUS_DMA_NOWAIT);
if (error) {
fp->eth_q_stats.tx_dma_mapping_failure++;
/* No sense in trying to defrag/copy chain, drop it. :( */
rc = error;
}
/* if the chain is still too long then drop it */
if (__predict_false(nsegs > 12)) {
rc = ENODEV;
}
}
}
bxe_tx_encap_continue:

View File

@ -1305,6 +1305,13 @@ struct extended_dev_info_shared_cfg { /* NVRAM OFFSET */
#define EXTENDED_DEV_INFO_SHARED_CFG_SRIOV_SHOW_MENU 0x00000000
#define EXTENDED_DEV_INFO_SHARED_CFG_SRIOV_HIDE_MENU 0x00000200
/* Overide PCIE revision ID when enabled the,
revision ID will set to B1=='0x11' */
#define EXTENDED_DEV_INFO_SHARED_CFG_OVR_REV_ID_MASK 0x00000400
#define EXTENDED_DEV_INFO_SHARED_CFG_OVR_REV_ID_SHIFT 10
#define EXTENDED_DEV_INFO_SHARED_CFG_OVR_REV_ID_DISABLED 0x00000000
#define EXTENDED_DEV_INFO_SHARED_CFG_OVR_REV_ID_ENABLED 0x00000400
/* Threshold in celcius for max continuous operation */
uint32_t temperature_report; /* 0x4014 */
#define EXTENDED_DEV_INFO_SHARED_CFG_TEMP_MCOT_MASK 0x0000007F