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 <ciara.lof...@intel.com> --- drivers/net/af_xdp/rte_eth_af_xdp.c | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/drivers/net/af_xdp/rte_eth_af_xdp.c b/drivers/net/af_xdp/rte_eth_af_xdp.c index 5f493951f6..309b96c9b4 100644 --- a/drivers/net/af_xdp/rte_eth_af_xdp.c +++ b/drivers/net/af_xdp/rte_eth_af_xdp.c @@ -1284,6 +1284,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; @@ -1335,14 +1349,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) { @@ -1351,12 +1357,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: -- 2.25.1