SUNRPC: Fix an RPC/RDMA performance regression
authorTrond Myklebust <trond.myklebust@hammerspace.com>
Thu, 28 Apr 2022 19:46:01 +0000 (15:46 -0400)
committerTrond Myklebust <trond.myklebust@hammerspace.com>
Sun, 10 Jul 2022 23:00:53 +0000 (19:00 -0400)
Use the standard gfp mask instead of using GFP_NOWAIT. The latter causes
issues when under memory pressure.

Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
net/sunrpc/auth_gss/auth_gss.c
net/sunrpc/sched.c
net/sunrpc/xprtrdma/transport.c

index de7e5b41ab8f092898bd4c4f6a91afa5e9a2b0ea..a31a27816cc0f8bdcbefe751a0eb1e8dc60bbf5e 100644 (file)
@@ -1340,14 +1340,11 @@ gss_hash_cred(struct auth_cred *acred, unsigned int hashbits)
 /*
  * Lookup RPCSEC_GSS cred for the current process
  */
-static struct rpc_cred *
-gss_lookup_cred(struct rpc_auth *auth, struct auth_cred *acred, int flags)
+static struct rpc_cred *gss_lookup_cred(struct rpc_auth *auth,
+                                       struct auth_cred *acred, int flags)
 {
-       gfp_t gfp = GFP_KERNEL;
-
-       if (flags & RPCAUTH_LOOKUP_ASYNC)
-               gfp = GFP_NOWAIT | __GFP_NOWARN;
-       return rpcauth_lookup_credcache(auth, acred, flags, gfp);
+       return rpcauth_lookup_credcache(auth, acred, flags,
+                                       rpc_task_gfp_mask());
 }
 
 static struct rpc_cred *
index 7f70c1e608b7ce4f07f3651e70a764050c292dc5..25b9221950ffbfa43f47498c6af563548f2eb54f 100644 (file)
@@ -63,6 +63,7 @@ gfp_t rpc_task_gfp_mask(void)
                return GFP_KERNEL | __GFP_NORETRY | __GFP_NOWARN;
        return GFP_KERNEL;
 }
+EXPORT_SYMBOL_GPL(rpc_task_gfp_mask);
 
 unsigned long
 rpc_task_timeout(const struct rpc_task *task)
index 6b7e10e5a141d6f6230b4f0727fb2d3fbb94d38b..bcb37b51adf65878eda0910833fa85efe7f12484 100644 (file)
@@ -571,11 +571,7 @@ xprt_rdma_allocate(struct rpc_task *task)
        struct rpc_rqst *rqst = task->tk_rqstp;
        struct rpcrdma_xprt *r_xprt = rpcx_to_rdmax(rqst->rq_xprt);
        struct rpcrdma_req *req = rpcr_to_rdmar(rqst);
-       gfp_t flags;
-
-       flags = RPCRDMA_DEF_GFP;
-       if (RPC_IS_ASYNC(task))
-               flags = GFP_NOWAIT | __GFP_NOWARN;
+       gfp_t flags = rpc_task_gfp_mask();
 
        if (!rpcrdma_check_regbuf(r_xprt, req->rl_sendbuf, rqst->rq_callsize,
                                  flags))