From e39a0a37cf77deec34abdfbcfd64c9a1291b2da5 Mon Sep 17 00:00:00 2001 From: Andrew Gallatin Date: Tue, 3 Apr 2007 10:41:33 +0000 Subject: [PATCH] - 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. --- sys/dev/mxge/if_mxge.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/sys/dev/mxge/if_mxge.c b/sys/dev/mxge/if_mxge.c index 5a82f744fb4..01eb3605bdd 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) {