80 lines
2.4 KiB
Diff
80 lines
2.4 KiB
Diff
From 81fe6720f84fde2a9fe65f688d7895ca348f0738 Mon Sep 17 00:00:00 2001
|
|
From: Ciara Loftus <ciara.loftus@intel.com>
|
|
Date: Fri, 18 Feb 2022 11:20:37 +0000
|
|
Subject: [PATCH] net/af_xdp: reserve fill queue before socket create
|
|
|
|
[ upstream commit 81fe6720f84fde2a9fe65f688d7895ca348f0738 ]
|
|
|
|
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.loftus@intel.com>
|
|
Tested-by: Ferruh Yigit <ferruh.yigit@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 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:
|
|
--
|
|
2.33.0
|
|
|