| Bug ID | 1779 |
|---|---|
| Summary | Packet segments do not get freed in mprq_buf_to_pkt() upon encountering MLX5_RXQ_CODE_NOMBUF |
| Product | DPDK |
| Version | 22.11 |
| Hardware | x86 |
| OS | Linux |
| Status | UNCONFIRMED |
| Severity | major |
| Priority | Normal |
| Component | ethdev |
| Assignee | dev@dpdk.org |
| Reporter | canary.overflow@gmail.com |
| Target Milestone | --- |
drivers/net/mlx5/mlx5_rx.h mprq_buf_to_pkt(...): There are 2 issues: - uint32_t seg_len = RTE_MIN(len, (uint32_t)(pkt->buf_len - RTE_PKTMBUF_HEADROOM)) seems unnecessary as to hit this code, len has to be greater than (uint32_t)(pkt->buf_len - RTE_PKTMBUF_HEADROOM) due to the if condition - If the allocation struct rte_mbuf *next = rte_pktmbuf_alloc(rxq->mp) fails and packet has more than 2 segs, the segs that were allocated previously do not get freed mprq_buf_to_pkt(...) { ... } else if (rxq->strd_scatter_en) { struct rte_mbuf *prev = pkt; uint32_t seg_len = RTE_MIN(len, (uint32_t) (pkt->buf_len - RTE_PKTMBUF_HEADROOM)); uint32_t rem_len = len - seg_len; rte_memcpy(rte_pktmbuf_mtod(pkt, void *), addr, seg_len); DATA_LEN(pkt) = seg_len; while (rem_len) { struct rte_mbuf *next = rte_pktmbuf_alloc(rxq->mp); if (unlikely(next == NULL)) return MLX5_RXQ_CODE_NOMBUF; ... } ... } ... } Should rte_pktmbuf_free() be used instead?