All of lore.kernel.org
 help / color / mirror / Atom feed
From: NeilBrown <neilb@suse.de>
To: Trond Myklebust <trond.myklebust@hammerspace.com>,
	Anna Schumaker <anna@kernel.org>
Cc: linux-nfs@vger.kernel.org
Subject: [PATCH 02/11] SUNRPC/call_alloc: async tasks mustn't block waiting for memory
Date: Mon, 07 Mar 2022 10:41:44 +1100	[thread overview]
Message-ID: <164661010494.31054.3655053845587236983.stgit@noble.brown> (raw)
In-Reply-To: <164660993703.31054.17075972410545449555.stgit@noble.brown>

When memory is short, new worker threads cannot be created and we depend
on the minimum one rpciod thread to be able to handle everything.
So it must not block waiting for memory.

mempools are particularly a problem as memory can only be released back
to the mempool by an async rpc task running.  If all available
workqueue threads are waiting on the mempool, no thread is available to
return anything.

rpc_malloc() can block, and this might cause deadlocks.
So check RPC_IS_ASYNC(), rather than RPC_IS_SWAPPER() to determine if
blocking is acceptable.

Signed-off-by: NeilBrown <neilb@suse.de>
---
 net/sunrpc/sched.c              |    4 +++-
 net/sunrpc/xprtrdma/transport.c |    4 +++-
 2 files changed, 6 insertions(+), 2 deletions(-)

diff --git a/net/sunrpc/sched.c b/net/sunrpc/sched.c
index e2c835482791..d5b6e897f5a5 100644
--- a/net/sunrpc/sched.c
+++ b/net/sunrpc/sched.c
@@ -1023,8 +1023,10 @@ int rpc_malloc(struct rpc_task *task)
 	struct rpc_buffer *buf;
 	gfp_t gfp = GFP_NOFS;
 
+	if (RPC_IS_ASYNC(task))
+		gfp = GFP_NOWAIT | __GFP_NOWARN;
 	if (RPC_IS_SWAPPER(task))
-		gfp = __GFP_MEMALLOC | GFP_NOWAIT | __GFP_NOWARN;
+		gfp |= __GFP_MEMALLOC;
 
 	size += sizeof(struct rpc_buffer);
 	if (size <= RPC_BUFFER_MAXSIZE)
diff --git a/net/sunrpc/xprtrdma/transport.c b/net/sunrpc/xprtrdma/transport.c
index 42e375dbdadb..5714bf880e95 100644
--- a/net/sunrpc/xprtrdma/transport.c
+++ b/net/sunrpc/xprtrdma/transport.c
@@ -570,8 +570,10 @@ xprt_rdma_allocate(struct rpc_task *task)
 	gfp_t flags;
 
 	flags = RPCRDMA_DEF_GFP;
+	if (RPC_IS_ASYNC(task))
+		flags = GFP_NOWAIT | __GFP_NOWARN;
 	if (RPC_IS_SWAPPER(task))
-		flags = __GFP_MEMALLOC | GFP_NOWAIT | __GFP_NOWARN;
+		flags |= __GFP_MEMALLOC;
 
 	if (!rpcrdma_check_regbuf(r_xprt, req->rl_sendbuf, rqst->rq_callsize,
 				  flags))



  parent reply	other threads:[~2022-03-06 23:42 UTC|newest]

Thread overview: 13+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-03-06 23:41 [PATCH 00/11] Various NFS/sunrpc improvements for swap-over-NFS NeilBrown
2022-03-06 23:41 ` [PATCH 10/11] NFS: swap-out must always use STABLE writes NeilBrown
2022-03-06 23:41 ` [PATCH 05/11] SUNRPC: remove scheduling boost for "SWAPPER" tasks NeilBrown
2022-03-06 23:41 ` [PATCH 03/11] SUNRPC/auth: async tasks mustn't block waiting for memory NeilBrown
2022-03-06 23:41 ` [PATCH 08/11] NFSv4: keep state manager thread active if swap is enabled NeilBrown
2022-03-06 23:41 ` [PATCH 07/11] SUNRPC: improve 'swap' handling: scheduling and PF_MEMALLOC NeilBrown
2022-03-06 23:41 ` [PATCH 04/11] SUNRPC/xprt: async tasks mustn't block waiting for memory NeilBrown
2022-03-06 23:41 ` [PATCH 09/11] NFS: swap IO handling is slightly different for O_DIRECT IO NeilBrown
2022-03-06 23:41 ` [PATCH 06/11] NFS: discard NFS_RPC_SWAPFLAGS and RPC_TASK_ROOTCREDS NeilBrown
2022-03-06 23:41 ` [PATCH 01/11] NFS: remove IS_SWAPFILE hack NeilBrown
2022-03-06 23:41 ` NeilBrown [this message]
2022-03-06 23:41 ` [PATCH 11/11] SUNRPC: change locking for xs_swap_enable/disable NeilBrown
2022-03-10  0:48 ` [PATCH 00/11] Various NFS/sunrpc improvements for swap-over-NFS NeilBrown

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=164661010494.31054.3655053845587236983.stgit@noble.brown \
    --to=neilb@suse.de \
    --cc=anna@kernel.org \
    --cc=linux-nfs@vger.kernel.org \
    --cc=trond.myklebust@hammerspace.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.