SUNRPC: Update svcxdr_init_decode() to call xdr_set_scratch_folio()

The only snag here is that __folio_alloc_node() doesn't handle
NUMA_NO_NODE, so I also need to update svc_pool_map_get_node() to return
numa_mem_id() instead. I arrived at this approach by  looking at what
other users of __folio_alloc_node() do for this case.

Signed-off-by: Anna Schumaker <anna.schumaker@oracle.com>
This commit is contained in:
Anna Schumaker 2025-06-30 14:53:09 -04:00
parent 4b7c3b4c67
commit d57e43b72b
2 changed files with 7 additions and 7 deletions

View File

@ -196,7 +196,7 @@ struct svc_rqst {
struct xdr_buf rq_arg; struct xdr_buf rq_arg;
struct xdr_stream rq_arg_stream; struct xdr_stream rq_arg_stream;
struct xdr_stream rq_res_stream; struct xdr_stream rq_res_stream;
struct page *rq_scratch_page; struct folio *rq_scratch_folio;
struct xdr_buf rq_res; struct xdr_buf rq_res;
unsigned long rq_maxpages; /* num of entries in rq_pages */ unsigned long rq_maxpages; /* num of entries in rq_pages */
struct page * *rq_pages; struct page * *rq_pages;
@ -503,7 +503,7 @@ static inline void svcxdr_init_decode(struct svc_rqst *rqstp)
buf->len = buf->head->iov_len + buf->page_len + buf->tail->iov_len; buf->len = buf->head->iov_len + buf->page_len + buf->tail->iov_len;
xdr_init_decode(xdr, buf, argv->iov_base, NULL); xdr_init_decode(xdr, buf, argv->iov_base, NULL);
xdr_set_scratch_page(xdr, rqstp->rq_scratch_page); xdr_set_scratch_folio(xdr, rqstp->rq_scratch_folio);
} }
/** /**

View File

@ -352,7 +352,7 @@ static int svc_pool_map_get_node(unsigned int pidx)
if (m->mode == SVC_POOL_PERNODE) if (m->mode == SVC_POOL_PERNODE)
return m->pool_to[pidx]; return m->pool_to[pidx];
} }
return NUMA_NO_NODE; return numa_mem_id();
} }
/* /*
* Set the given thread's cpus_allowed mask so that it * Set the given thread's cpus_allowed mask so that it
@ -669,8 +669,8 @@ svc_rqst_free(struct svc_rqst *rqstp)
folio_batch_release(&rqstp->rq_fbatch); folio_batch_release(&rqstp->rq_fbatch);
kfree(rqstp->rq_bvec); kfree(rqstp->rq_bvec);
svc_release_buffer(rqstp); svc_release_buffer(rqstp);
if (rqstp->rq_scratch_page) if (rqstp->rq_scratch_folio)
put_page(rqstp->rq_scratch_page); folio_put(rqstp->rq_scratch_folio);
kfree(rqstp->rq_resp); kfree(rqstp->rq_resp);
kfree(rqstp->rq_argp); kfree(rqstp->rq_argp);
kfree(rqstp->rq_auth_data); kfree(rqstp->rq_auth_data);
@ -691,8 +691,8 @@ svc_prepare_thread(struct svc_serv *serv, struct svc_pool *pool, int node)
rqstp->rq_server = serv; rqstp->rq_server = serv;
rqstp->rq_pool = pool; rqstp->rq_pool = pool;
rqstp->rq_scratch_page = alloc_pages_node(node, GFP_KERNEL, 0); rqstp->rq_scratch_folio = __folio_alloc_node(GFP_KERNEL, 0, node);
if (!rqstp->rq_scratch_page) if (!rqstp->rq_scratch_folio)
goto out_enomem; goto out_enomem;
rqstp->rq_argp = kmalloc_node(serv->sv_xdrsize, GFP_KERNEL, node); rqstp->rq_argp = kmalloc_node(serv->sv_xdrsize, GFP_KERNEL, node);