https://bugs.dpdk.org/show_bug.cgi?id=1779 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? -- You are receiving this mail because: You are the assignee for the bug.