[Intel-wired-lan] [PATCH iwl-next 09/10] ixgbevf: reconfigure page pool when reallocating buffers

Larysa Zaremba
2026-02-23T10:23:10Z

Currently, when MTU is changed, page pool is not reconfigured, which leads
to usage of suboptimal buffer sizes.

Always destroy page pool when cleaning the ring up and create it anew when
we first allocate Rx buffers.

Reviewed-by: Aleksandr Loktionov <aleksandr.loktionov@intel.com>
Signed-off-by: Larysa Zaremba <larysa.zaremba@intel.com>
---
.../net/ethernet/intel/ixgbevf/ixgbevf_main.c | 69 +++++++++----------
1 file changed, 33 insertions(+), 36 deletions(-)

diff --git a/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c b/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c
index 790e86135fbd..606c6123d7eb 100644
--- a/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c
+++ b/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c
@@ -1660,6 +1660,12 @@ static void ixgbevf_rx_destroy_pp(struct ixgbevf_ring *rx_ring)
.fqes = rx_ring->rx_fqes,
};

+ if (!fq.pp)
+ return;
+
+ xdp_rxq_info_detach_mem_model(&rx_ring->xdp_rxq);
+ xdp_rxq_info_unreg(&rx_ring->xdp_rxq);
+
libeth_rx_fq_destroy(&fq);
rx_ring->rx_fqes = NULL;
rx_ring->pp = NULL;
@@ -1710,6 +1716,14 @@ static int ixgbevf_rx_create_pp(struct ixgbevf_ring *rx_ring)
rx_ring->truesize = fq.truesize;
rx_ring->rx_buf_len = fq.buf_len;

+ /* XDP RX-queue info */
+ ret = __xdp_rxq_info_reg(&rx_ring->xdp_rxq, rx_ring->netdev,
+ rx_ring->queue_index, 0, rx_ring->truesize);
+ if (ret)
+ goto err;
+
+ xdp_rxq_info_attach_page_pool(&rx_ring->xdp_rxq, rx_ring->pp);
+
if (!fq.hsplit)
return 0;

@@ -1779,6 +1793,8 @@ static void ixgbevf_configure_rx_ring(struct ixgbevf_adapter *adapter,
ring->next_to_clean = 0;
ring->next_to_use = 0;

+ ixgbevf_rx_create_pp(ring);
+
/* RXDCTL.RLPML does not work on 82599 */
if (adapter->hw.mac.type != ixgbe_mac_82599_vf) {
u32 pkt_len =
@@ -2271,8 +2287,10 @@ static void ixgbevf_clean_all_rx_rings(struct ixgbevf_adapter *adapter)
{
int i;

- for (i = 0; i < adapter->num_rx_queues; i++)
+ for (i = 0; i < adapter->num_rx_queues; i++) {
ixgbevf_clean_rx_ring(adapter->rx_ring[i]);
+ ixgbevf_rx_destroy_pp(adapter->rx_ring[i]);
+ }
}

/**
@@ -3293,6 +3311,11 @@ static int ixgbevf_setup_all_tx_resources(struct ixgbevf_adapter *adapter)
return err;
}

+static struct device *ixgbevf_dma_dev_from_ring(struct ixgbevf_ring *ring)
+{
+ return &ring->q_vector->adapter->pdev->dev;
+}
+
/**
* ixgbevf_setup_rx_resources - allocate Rx resources
* @adapter: board private structure
@@ -3303,41 +3326,25 @@ static int ixgbevf_setup_all_tx_resources(struct ixgbevf_adapter *adapter)
int ixgbevf_setup_rx_resources(struct ixgbevf_adapter *adapter,
struct ixgbevf_ring *rx_ring)
{
- int ret;
-
- ret = ixgbevf_rx_create_pp(rx_ring);
- if (ret)
- return ret;
-
u64_stats_init(&rx_ring->syncp);

/* Round up to nearest 4K */
rx_ring->dma_size = rx_ring->count * sizeof(union ixgbe_adv_rx_desc);
rx_ring->dma_size = ALIGN(rx_ring->dma_size, 4096);

- rx_ring->desc = dma_alloc_coherent(rx_ring->pp->p.dev,
+ rx_ring->desc = dma_alloc_coherent(ixgbevf_dma_dev_from_ring(rx_ring),
rx_ring->dma_size,
&rx_ring->dma, GFP_KERNEL);

- if (!rx_ring->desc)
- goto err;
-
- /* XDP RX-queue info */
- ret = __xdp_rxq_info_reg(&rx_ring->xdp_rxq, adapter->netdev,
- rx_ring->queue_index, 0, rx_ring->truesize);
- if (ret)
- goto err;
-
- xdp_rxq_info_attach_page_pool(&rx_ring->xdp_rxq, rx_ring->pp);
+ if (!rx_ring->desc) {
+ dev_err(rx_ring->dev,
+ "Unable to allocate memory for the Rx descriptor ring\n");
+ return -ENOMEM;
+ }

rx_ring->xdp_prog = adapter->xdp_prog;

return 0;
-err:
- ixgbevf_rx_destroy_pp(rx_ring);
- dev_err(rx_ring->dev, "Unable to allocate memory for the Rx descriptor ring\n");
-
- return ret;
}

/**
@@ -3378,24 +3385,14 @@ static int ixgbevf_setup_all_rx_resources(struct ixgbevf_adapter *adapter)
**/
void ixgbevf_free_rx_resources(struct ixgbevf_ring *rx_ring)
{
- struct libeth_fq fq = {
- .fqes = rx_ring->rx_fqes,
- .pp = rx_ring->pp,
- };
-
ixgbevf_clean_rx_ring(rx_ring);
-
+ ixgbevf_rx_destroy_pp(rx_ring);
rx_ring->xdp_prog = NULL;
- xdp_rxq_info_detach_mem_model(&rx_ring->xdp_rxq);
- xdp_rxq_info_unreg(&rx_ring->xdp_rxq);

- dma_free_coherent(fq.pp->p.dev, rx_ring->dma_size, rx_ring->desc,
+ dma_free_coherent(ixgbevf_dma_dev_from_ring(rx_ring),
+ rx_ring->dma_size, rx_ring->desc,
rx_ring->dma);
rx_ring->desc = NULL;
-
- libeth_rx_fq_destroy(&fq);
- rx_ring->rx_fqes = NULL;
- rx_ring->pp = NULL;
}

/**
--
2.52.0