[RFC PATCH v2 20/25] net/libeth: Use GFP_KERNEL when pre-filling RX rings
From: Luigi Rizzo
Date: Mon Nov 09 2026 - 13:31:30 EST
libeth_rx_alloc() is called both when pre-filling RX fill queues in
process context (for indices 0 .. fq->count - 2, when buf->truesize is
still 0) and when refilling RX buffers from NAPI softirq.
Use GFP_KERNEL during the initial process-context ring fill so page_pool
and PISA page allocations (including set_memory_decrypted() under CoCo)
are not forced into GFP_ATOMIC context.
Signed-off-by: Luigi Rizzo <lrizzo@xxxxxxxxxx>
---
include/net/libeth/rx.h | 11 +++++++++--
1 file changed, 9 insertions(+), 2 deletions(-)
diff --git a/include/net/libeth/rx.h b/include/net/libeth/rx.h
index 0e736846c5e8a..de1e5fe44aa40 100644
--- a/include/net/libeth/rx.h
+++ b/include/net/libeth/rx.h
@@ -106,10 +106,17 @@ void libeth_rx_fq_destroy(struct libeth_fq *fq);
static inline dma_addr_t libeth_rx_alloc(const struct libeth_fq_fp *fq, u32 i)
{
struct libeth_fqe *buf = &fq->fqes[i];
+ /* fq->fqes is zero-allocated and pre-filled in process context for
+ * indices [0 .. fq->count - 2]; slot fq->count - 1 is first allocated
+ * in NAPI. Use GFP_KERNEL for initial pre-fill and GFP_ATOMIC after.
+ */
+ gfp_t gfp = (buf->truesize || i == fq->count - 1) ?
+ GFP_ATOMIC : GFP_KERNEL;
buf->truesize = fq->truesize;
- buf->netmem = page_pool_dev_alloc_netmem(fq->pp, &buf->offset,
- &buf->truesize);
+ buf->netmem = page_pool_alloc_netmem(fq->pp, &buf->offset,
+ &buf->truesize,
+ gfp | __GFP_NOWARN);
if (unlikely(!buf->netmem))
return DMA_MAPPING_ERROR;
--
2.56.0.542.g3ef89b7020-goog