[RFC PATCH v2 21/25] net/gve: Use GFP_KERNEL when pre-filling RX rings
From: Luigi Rizzo
Date: Mon Nov 09 2026 - 13:36:14 EST
When pre-filling DQO and GQI RX rings in process context before NAPI is
enabled (e.g. gve_open), use GFP_KERNEL instead of GFP_ATOMIC so page
allocation (and CoCo page decryption) can sleep instead of dipping into
atomic reserves.
Signed-off-by: Luigi Rizzo <lrizzo@xxxxxxxxxx>
---
drivers/net/ethernet/google/gve/gve_buffer_mgmt_dqo.c | 7 ++++++-
drivers/net/ethernet/google/gve/gve_rx.c | 8 ++++++--
2 files changed, 12 insertions(+), 3 deletions(-)
diff --git a/drivers/net/ethernet/google/gve/gve_buffer_mgmt_dqo.c b/drivers/net/ethernet/google/gve/gve_buffer_mgmt_dqo.c
index 6880d1531ba5e..3b13aa4999ae5 100644
--- a/drivers/net/ethernet/google/gve/gve_buffer_mgmt_dqo.c
+++ b/drivers/net/ethernet/google/gve/gve_buffer_mgmt_dqo.c
@@ -223,13 +223,18 @@ void gve_free_to_page_pool(struct gve_rx_ring *rx,
static int gve_alloc_from_page_pool(struct gve_rx_ring *rx,
struct gve_rx_buf_state_dqo *buf_state)
{
+ /*
+ * Use GFP_KERNEL when pre-filling RX rings in process context (e.g.
+ * gve_open) so PISA metadata init and CoCo page decryption can sleep.
+ */
+ gfp_t gfp = gve_get_napi_enabled(rx->gve) ? GFP_ATOMIC : GFP_KERNEL;
netmem_ref netmem;
buf_state->page_info.buf_size = rx->packet_buffer_truesize;
netmem = page_pool_alloc_netmem(rx->dqo.page_pool,
&buf_state->page_info.page_offset,
&buf_state->page_info.buf_size,
- GFP_ATOMIC);
+ gfp);
if (!netmem)
return -ENOMEM;
diff --git a/drivers/net/ethernet/google/gve/gve_rx.c b/drivers/net/ethernet/google/gve/gve_rx.c
index 81ea800e66e94..89f287b678bf0 100644
--- a/drivers/net/ethernet/google/gve/gve_rx.c
+++ b/drivers/net/ethernet/google/gve/gve_rx.c
@@ -161,12 +161,16 @@ static int gve_rx_alloc_buffer(struct gve_priv *priv, struct device *dev,
union gve_rx_data_slot *data_slot,
struct gve_rx_ring *rx)
{
+ /*
+ * Use GFP_KERNEL when pre-filling RX rings in process context (e.g.
+ * gve_open) so PISA metadata init and CoCo page decryption can sleep.
+ */
+ gfp_t gfp = gve_get_napi_enabled(priv) ? GFP_ATOMIC : GFP_KERNEL;
struct page *page;
dma_addr_t dma;
int err;
- err = gve_alloc_page(priv, dev, &page, &dma, DMA_FROM_DEVICE,
- GFP_ATOMIC);
+ err = gve_alloc_page(priv, dev, &page, &dma, DMA_FROM_DEVICE, gfp);
if (err) {
u64_stats_update_begin(&rx->statss);
rx->rx_buf_alloc_fail++;
--
2.56.0.542.g3ef89b7020-goog