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 <[email protected]>
Signed-off-by: Larysa Zaremba <[email protected]>
---
 .../net/ethernet/intel/ixgbevf/ixgbevf_main.c | 67 +++++++++----------
 1 file changed, 31 insertions(+), 36 deletions(-)

diff --git a/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c 
b/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c
index b9a9607d1314..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,43 +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) {
-               ret = -ENOMEM;
-               goto err;
+               dev_err(rx_ring->dev,
+                       "Unable to allocate memory for the Rx descriptor 
ring\n");
+               return -ENOMEM;
        }
 
-       /* 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);
-
        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;
 }
 
 /**
@@ -3380,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

Reply via email to