summaryrefslogtreecommitdiffstats
path: root/sys/dev/mxge
diff options
context:
space:
mode:
authorgallatin <gallatin@FreeBSD.org>2007-04-03 10:41:33 +0000
committergallatin <gallatin@FreeBSD.org>2007-04-03 10:41:33 +0000
commitc277843c2225aefe5e5c60e49de3fc0f95f7a798 (patch)
treec0640a5cd7d6710995c62aa7bb3bd8c378eef077 /sys/dev/mxge
parent8fc6b66de9fdbd36321373481c672aa32e4034f0 (diff)
downloadFreeBSD-src-c277843c2225aefe5e5c60e49de3fc0f95f7a798.zip
FreeBSD-src-c277843c2225aefe5e5c60e49de3fc0f95f7a798.tar.gz
- Fix a bug in the TSO transmit routine where frames which had
been defragged and had their headers in the same cluster as their payload would be fed to the NIC in header-sized chunks, and would likely exceed the number of available transmit descriptors. - If a TSO frame exceeds the number of available transmit descriptors, don't leak busdmma resources when freeing it. Sponsored by: Myricom Inc.
Diffstat (limited to 'sys/dev/mxge')
-rw-r--r--sys/dev/mxge/if_mxge.c4
1 files changed, 3 insertions, 1 deletions
diff --git a/sys/dev/mxge/if_mxge.c b/sys/dev/mxge/if_mxge.c
index 5a82f74..01eb360 100644
--- a/sys/dev/mxge/if_mxge.c
+++ b/sys/dev/mxge/if_mxge.c
@@ -1446,10 +1446,11 @@ mxge_encap_tso(mxge_softc_t *sc, struct mbuf *m, int busdma_seg_cnt)
/* Break the busdma segment up into pieces*/
low = MXGE_LOWPART_TO_U32(seg->ds_addr);
high_swapped = htobe32(MXGE_HIGHPART_TO_U32(seg->ds_addr));
- len = seglen = seg->ds_len;
+ len = seg->ds_len;
while (len) {
flags_next = flags & ~MXGEFW_FLAGS_FIRST;
+ seglen = len;
cum_len_next = cum_len + seglen;
(req-rdma_count)->rdma_count = rdma_count + 1;
if (__predict_true(cum_len >= 0)) {
@@ -1514,6 +1515,7 @@ mxge_encap_tso(mxge_softc_t *sc, struct mbuf *m, int busdma_seg_cnt)
return;
drop:
+ bus_dmamap_unload(tx->dmat, tx->info[tx->req & tx->mask].map);
m_freem(m);
sc->ifp->if_oerrors++;
if (!once) {
OpenPOWER on IntegriCloud