On Mon, 2019-03-04 at 10:32 -0500, Chuck Lever wrote: > Page allocation requests made when the SPARSE_PAGES flag is set are > allowed to fail, and are not critical. No need to spend a rare > resource. > > Signed-off-by: Chuck Lever <chuck.lever@xxxxxxxxxx> > --- > net/sunrpc/socklib.c | 2 +- > net/sunrpc/xprtrdma/rpc_rdma.c | 2 +- > 2 files changed, 2 insertions(+), 2 deletions(-) > > diff --git a/net/sunrpc/socklib.c b/net/sunrpc/socklib.c > index 7e55cfc..9faea12 100644 > --- a/net/sunrpc/socklib.c > +++ b/net/sunrpc/socklib.c > @@ -106,7 +106,7 @@ static size_t xdr_skb_read_and_csum_bits(struct > xdr_skb_reader *desc, void *to, > /* ACL likes to be lazy in allocating pages - ACLs > * are small by default but can get huge. */ > if ((xdr->flags & XDRBUF_SPARSE_PAGES) && *ppage == > NULL) { > - *ppage = alloc_page(GFP_ATOMIC); > + *ppage = alloc_page(GFP_NOWAIT | __GFP_NOWARN); > if (unlikely(*ppage == NULL)) { > if (copied == 0) > copied = -ENOMEM; Hmm... Can't we make this GFP_KERNEL? I can't see that we're holding any locks here. It does look like svc_udp_recvfrom() is wrapping the call to csum_partial_copy_to_xdr() in a local_bh_disable()/enable() pair, but is that actually needed? If so, for what? > diff --git a/net/sunrpc/xprtrdma/rpc_rdma.c > b/net/sunrpc/xprtrdma/rpc_rdma.c > index 6c1fb27..b759b16 100644 > --- a/net/sunrpc/xprtrdma/rpc_rdma.c > +++ b/net/sunrpc/xprtrdma/rpc_rdma.c > @@ -238,7 +238,7 @@ static bool rpcrdma_results_inline(struct > rpcrdma_xprt *r_xprt, > */ > if (unlikely(xdrbuf->flags & XDRBUF_SPARSE_PAGES)) { > if (!*ppages) > - *ppages = alloc_page(GFP_ATOMIC); > + *ppages = alloc_page(GFP_NOWAIT | > __GFP_NOWARN); > if (!*ppages) > return -ENOBUFS; > } > Cheers Trond -- Trond Myklebust Linux NFS client maintainer, Hammerspace trond.myklebust@xxxxxxxxxxxxxxx