gve: Do not fully free QPL pages on prefill errors
authorShailend Chand <shailend@google.com>
Sat, 14 Oct 2023 01:41:21 +0000 (01:41 +0000)
committerPaolo Abeni <pabeni@redhat.com>
Tue, 17 Oct 2023 11:33:29 +0000 (13:33 +0200)
The prefill function should have only removed the page count bias it
added. Fully freeing the page will cause gve_free_queue_page_list to
free a page the driver no longer owns.

Fixes: 82fd151d38d9 ("gve: Reduce alloc and copy costs in the GQ rx path")
Signed-off-by: Shailend Chand <shailend@google.com>
Link: https://lore.kernel.org/r/20231014014121.2843922-1-shailend@google.com
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
drivers/net/ethernet/google/gve/gve_rx.c

index d1da741..e84a066 100644 (file)
@@ -146,7 +146,7 @@ static int gve_prefill_rx_pages(struct gve_rx_ring *rx)
                err = gve_rx_alloc_buffer(priv, &priv->pdev->dev, &rx->data.page_info[i],
                                          &rx->data.data_ring[i]);
                if (err)
-                       goto alloc_err;
+                       goto alloc_err_rda;
        }
 
        if (!rx->data.raw_addressing) {
@@ -171,12 +171,26 @@ static int gve_prefill_rx_pages(struct gve_rx_ring *rx)
        return slots;
 
 alloc_err_qpl:
+       /* Fully free the copy pool pages. */
        while (j--) {
                page_ref_sub(rx->qpl_copy_pool[j].page,
                             rx->qpl_copy_pool[j].pagecnt_bias - 1);
                put_page(rx->qpl_copy_pool[j].page);
        }
-alloc_err:
+
+       /* Do not fully free QPL pages - only remove the bias added in this
+        * function with gve_setup_rx_buffer.
+        */
+       while (i--)
+               page_ref_sub(rx->data.page_info[i].page,
+                            rx->data.page_info[i].pagecnt_bias - 1);
+
+       gve_unassign_qpl(priv, rx->data.qpl->id);
+       rx->data.qpl = NULL;
+
+       return err;
+
+alloc_err_rda:
        while (i--)
                gve_rx_free_buffer(&priv->pdev->dev,
                                   &rx->data.page_info[i],