diff options
author | gallatin <gallatin@FreeBSD.org> | 2007-04-03 10:41:33 +0000 |
---|---|---|
committer | gallatin <gallatin@FreeBSD.org> | 2007-04-03 10:41:33 +0000 |
commit | c277843c2225aefe5e5c60e49de3fc0f95f7a798 (patch) | |
tree | c0640a5cd7d6710995c62aa7bb3bd8c378eef077 /sys/dev/mxge | |
parent | 8fc6b66de9fdbd36321373481c672aa32e4034f0 (diff) | |
download | FreeBSD-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.c | 4 |
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) { |