From: Ciara Loftus Date: Fri, 18 Feb 2022 11:20:37 +0000 (+0000) Subject: net/af_xdp: reserve fill queue before socket create X-Git-Url: http://git.droids-corp.org/?a=commitdiff_plain;h=81fe6720f84fde2a9fe65f688d7895ca348f0738;p=dpdk.git net/af_xdp: reserve fill queue before socket create Some zero copy AF_XDP drivers eg. ice require that there are addresses already in the fill queue before the socket is created. Otherwise you may see log messages such as: XSK buffer pool does not provide enough addresses to fill 2047 buffers on Rx ring 0 This commit ensures that the addresses are available before creating the socket, instead of after. Signed-off-by: Ciara Loftus Tested-by: Ferruh Yigit --- diff --git a/drivers/net/af_xdp/rte_eth_af_xdp.c b/drivers/net/af_xdp/rte_eth_af_xdp.c index 7d5e2887b8..65479138d3 100644 --- a/drivers/net/af_xdp/rte_eth_af_xdp.c +++ b/drivers/net/af_xdp/rte_eth_af_xdp.c @@ -1283,6 +1283,20 @@ xsk_configure(struct pmd_internals *internals, struct pkt_rx_queue *rxq, return -ENOMEM; txq->umem = rxq->umem; +#if defined(XDP_UMEM_UNALIGNED_CHUNK_FLAG) + ret = rte_pktmbuf_alloc_bulk(rxq->umem->mb_pool, fq_bufs, reserve_size); + if (ret) { + AF_XDP_LOG(DEBUG, "Failed to get enough buffers for fq.\n"); + goto out_umem; + } +#endif + + ret = reserve_fill_queue(rxq->umem, reserve_size, fq_bufs, &rxq->fq); + if (ret) { + AF_XDP_LOG(ERR, "Failed to reserve fill queue.\n"); + goto out_umem; + } + cfg.rx_size = ring_size; cfg.tx_size = ring_size; cfg.libbpf_flags = 0; @@ -1334,14 +1348,6 @@ xsk_configure(struct pmd_internals *internals, struct pkt_rx_queue *rxq, } } -#if defined(XDP_UMEM_UNALIGNED_CHUNK_FLAG) - ret = rte_pktmbuf_alloc_bulk(rxq->umem->mb_pool, fq_bufs, reserve_size); - if (ret) { - AF_XDP_LOG(DEBUG, "Failed to get enough buffers for fq.\n"); - goto out_xsk; - } -#endif - if (rxq->busy_budget) { ret = configure_preferred_busy_poll(rxq); if (ret) { @@ -1350,12 +1356,6 @@ xsk_configure(struct pmd_internals *internals, struct pkt_rx_queue *rxq, } } - ret = reserve_fill_queue(rxq->umem, reserve_size, fq_bufs, &rxq->fq); - if (ret) { - AF_XDP_LOG(ERR, "Failed to reserve fill queue.\n"); - goto out_xsk; - } - return 0; out_xsk: