Re: [PATCH 4/4] netfs: Fix folio_queue ENOMEM in writeback by adding a mempool
From: Zhou, Yun
Date: Tue Jul 28 2026 - 04:42:29 EST
On 7/27/2026 9:07 PM, David Howells wrote:
Fix the handling of folio_queue allocation failure in writeback by adding a
mempool and passing in gfp_t flags to the rolling buffer functions that
allocate memory, using the mempool if gfp != GFP_KERNEL.
This is then extended upwards and the gfp to be used for a request is stored
in the netfs_io_request struct and is then used for both requests and
subrequests, eliminating the sleeping loops there.
Have you considered splitting this into multiple patches based on different functionalities?
@@ -200,12 +205,14 @@ struct netfs_io_subrequest *netfs_alloc_subrequest(struct netfs_io_request *rreq
mempool_t *mempool = rreq->netfs_ops->subrequest_pool ?: &netfs_subrequest_pool;
struct kmem_cache *cache = mempool->pool_data;
- for (;;) {
- subreq = mempool_alloc(rreq->netfs_ops->subrequest_pool ?: &netfs_subrequest_pool,
- GFP_KERNEL);
- if (subreq)
- break;
- msleep(10);
+ if (rreq->gfp == GFP_KERNEL) {
Direct equality checks are not reliable; using !(rreq->gfp & GFP_NOFS) for the check is more robust.
+ subreq = mempool->alloc(rreq->gfp, mempool->pool_data);
+ if (!subreq)
+ return ERR_PTR(-ENOMEM);
Since some callers check for success by testing !NULL, we cannot return ENOMEM.
221 subreq = netfs_alloc_subrequest(rreq);
222 if (!subreq) {
223 ret = -ENOMEM;
224 break;
+ } else {
+ subreq = mempool_alloc(mempool, rreq->gfp);
+ if (!subreq)
+ return NULL;
Redundant check. If it is added to mirror the GFP_KERNEL path above, returning the same error code would be better for the caller to handle. Or perhaps this is an intentional design?