mirror of
https://git.FreeBSD.org/src.git
synced 2025-01-06 13:09:50 +00:00
Plug mbuf leak in the busdma path of iflib.
Submitted by: Michael Tuexen <tuexen@freebsd.org> Reported by: Drew Gallitin <gallatin@netflix.com>
This commit is contained in:
parent
81c3737d95
commit
aa8fa07cd8
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=319917
@ -2880,8 +2880,8 @@ iflib_busdma_load_mbuf_sg(iflib_txq_t txq, bus_dma_tag_t tag, bus_dmamap_t map,
|
||||
if_ctx_t ctx;
|
||||
if_shared_ctx_t sctx;
|
||||
if_softc_ctx_t scctx;
|
||||
int i, next, pidx, mask, err, maxsegsz, ntxd, count;
|
||||
struct mbuf *m, *tmp, **ifsd_m, **mp;
|
||||
int i, next, pidx, err, maxsegsz, ntxd, count;
|
||||
struct mbuf *m, *tmp, **ifsd_m;
|
||||
|
||||
m = *m0;
|
||||
|
||||
@ -2905,19 +2905,22 @@ iflib_busdma_load_mbuf_sg(iflib_txq_t txq, bus_dma_tag_t tag, bus_dmamap_t map,
|
||||
if (err)
|
||||
return (err);
|
||||
ifsd_flags[pidx] |= TX_SW_DESC_MAPPED;
|
||||
i = 0;
|
||||
next = pidx;
|
||||
mask = (txq->ift_size-1);
|
||||
count = 0;
|
||||
m = *m0;
|
||||
do {
|
||||
mp = &ifsd_m[next];
|
||||
*mp = m;
|
||||
if (__predict_false(m->m_len <= 0)) {
|
||||
tmp = m;
|
||||
m = m->m_next;
|
||||
tmp->m_next = NULL;
|
||||
m_free(tmp);
|
||||
continue;
|
||||
}
|
||||
next = (pidx + count) & (ntxd-1);
|
||||
MPASS(ifsd_m[next] == NULL);
|
||||
ifsd_m[next] = m;
|
||||
count++;
|
||||
tmp = m;
|
||||
m = m->m_next;
|
||||
if (__predict_false((*mp)->m_len == 0)) {
|
||||
m_free(*mp);
|
||||
*mp = NULL;
|
||||
} else
|
||||
next = (pidx + i) & (ntxd-1);
|
||||
} while (m != NULL);
|
||||
} else {
|
||||
int buflen, sgsize, max_sgsize;
|
||||
|
Loading…
Reference in New Issue
Block a user