From: Jeff Layton <jlayton@kernel.org>
To: Chuck Lever <cel@kernel.org>, NeilBrown <neil@brown.name>,
Olga Kornievskaia <okorniev@redhat.com>,
Dai Ngo <Dai.Ngo@oracle.com>, Tom Talpey <tom@talpey.com>,
Trond Myklebust <trondmy@kernel.org>,
Anna Schumaker <anna@kernel.org>,
"David S. Miller" <davem@davemloft.net>,
Eric Dumazet <edumazet@google.com>,
Jakub Kicinski <kuba@kernel.org>,
Paolo Abeni <pabeni@redhat.com>, Simon Horman <horms@kernel.org>,
Shuah Khan <shuah@kernel.org>
Cc: Slawomir Stepien <sst@poczta.fm>,
linux-nfs@vger.kernel.org, linux-kernel@vger.kernel.org,
netdev@vger.kernel.org, Trond Myklebust <trondmy@gmail.com>,
linux-kselftest@vger.kernel.org,
Jeff Layton <jlayton@kernel.org>
Subject: [PATCH v4 09/14] SUNRPC: stop unregistering listeners once rpcbind stops answering
Date: Mon, 31 Aug 2026 12:14:51 -0400 [thread overview]
Message-ID: <20260831-nfsd-nl-hang-v4-9-0f4e89139409@kernel.org> (raw)
In-Reply-To: <20260831-nfsd-nl-hang-v4-0-0f4e89139409@kernel.org>
svc_delete_xprt() unregisters each listener it destroys. One
NFSD_CMD_LISTENER_SET that removes listeners therefore pays one local
rpcbind timeout for each of them, under nfsd_mutex, on top of the one the
create loop already bounds.
One failure is enough to know that the rest of the teardown will not fare
better. When the call gets no answer, clear XPT_RPCB_UNREG on every
remaining transport in the same net.
Assisted-by: LLM
Signed-off-by: Jeff Layton <jlayton@kernel.org>
---
net/sunrpc/svc_xprt.c | 20 ++++++++++++++++++++
1 file changed, 20 insertions(+)
diff --git a/net/sunrpc/svc_xprt.c b/net/sunrpc/svc_xprt.c
index 40040af588fb..7e471c92f23a 100644
--- a/net/sunrpc/svc_xprt.c
+++ b/net/sunrpc/svc_xprt.c
@@ -1101,6 +1101,22 @@ static void call_xpt_users(struct svc_xprt *xprt)
spin_unlock(&xprt->xpt_lock);
}
+/*
+ * If rpcbind stops answering, every listener still to be destroyed would
+ * only wait out the same timeout again. Drop the flag on all of the
+ * remaining listeners.
+ */
+static void svc_xprt_clear_rpcb_unreg(struct svc_serv *serv, struct net *net)
+{
+ struct svc_xprt *xprt;
+
+ spin_lock_bh(&serv->sv_lock);
+ list_for_each_entry(xprt, &serv->sv_permsocks, xpt_list)
+ if (xprt->xpt_net == net)
+ clear_bit(XPT_RPCB_UNREG, &xprt->xpt_flags);
+ spin_unlock_bh(&serv->sv_lock);
+}
+
/*
* Remove a dead transport
*/
@@ -1115,11 +1131,15 @@ static void svc_delete_xprt(struct svc_xprt *xprt)
struct svc_sock *svsk = container_of(xprt, struct svc_sock,
sk_xprt);
struct socket *sock = svsk->sk_sock;
+ unsigned int failures = svc_rpcb_failure_count(serv);
if (svc_register(serv, xprt->xpt_net, sock->sk->sk_family,
sock->sk->sk_protocol, 0) < 0)
pr_warn("failed to unregister %s with rpcbind\n",
xprt->xpt_class->xcl_name);
+
+ if (svc_rpcb_failure_count(serv) != failures)
+ svc_xprt_clear_rpcb_unreg(serv, xprt->xpt_net);
}
if (test_and_set_bit(XPT_DEAD, &xprt->xpt_flags))
--
2.55.0
next prev parent reply other threads:[~2026-08-31 16:15 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-08-31 16:14 [PATCH v4 00/14] nfsd/sunrpc: harden the netlink listener set interface Jeff Layton
2026-08-31 16:14 ` [PATCH v4 01/14] NFSD: cap the number of listeners accepted in listener_set Jeff Layton
2026-08-31 16:14 ` [PATCH v4 02/14] NFSD: validate transport name in listener_set before serv creation Jeff Layton
2026-08-31 16:14 ` [PATCH v4 03/14] SUNRPC: keep the first error in svc_register() Jeff Layton
2026-08-31 16:14 ` [PATCH v4 04/14] SUNRPC: bound the local rpcbind client timeout to 1s Jeff Layton
2026-08-31 16:14 ` [PATCH v4 05/14] NFSD: report listener creation failures through extack Jeff Layton
2026-08-31 16:14 ` [PATCH v4 06/14] SUNRPC: report local rpcbind calls that get no answer Jeff Layton
2026-08-31 16:14 ` [PATCH v4 07/14] SUNRPC: stop svc_register() once rpcbind stops answering Jeff Layton
2026-08-31 16:14 ` [PATCH v4 08/14] SUNRPC: stop the svc_unregister() sweep " Jeff Layton
2026-08-31 16:14 ` Jeff Layton [this message]
2026-08-31 16:14 ` [PATCH v4 10/14] NFSD: stop registering with rpcbind after a failure in listener_set Jeff Layton
2026-08-31 16:14 ` [PATCH v4 11/14] selftests/nfsd: exercise listener_set request validation Jeff Layton
2026-08-31 16:14 ` [PATCH v4 12/14] selftests/nfsd: add a per-netns rpcbind stub and the listener round-trips Jeff Layton
2026-08-31 16:14 ` [PATCH v4 13/14] selftests/nfsd: check that listener_set asks rpcbind once Jeff Layton
2026-08-31 16:14 ` [PATCH v4 14/14] selftests/nfsd: check that listener removal " Jeff Layton
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=20260831-nfsd-nl-hang-v4-9-0f4e89139409@kernel.org \
--to=jlayton@kernel.org \
--cc=Dai.Ngo@oracle.com \
--cc=anna@kernel.org \
--cc=cel@kernel.org \
--cc=davem@davemloft.net \
--cc=edumazet@google.com \
--cc=horms@kernel.org \
--cc=kuba@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-kselftest@vger.kernel.org \
--cc=linux-nfs@vger.kernel.org \
--cc=neil@brown.name \
--cc=netdev@vger.kernel.org \
--cc=okorniev@redhat.com \
--cc=pabeni@redhat.com \
--cc=shuah@kernel.org \
--cc=sst@poczta.fm \
--cc=tom@talpey.com \
--cc=trondmy@gmail.com \
--cc=trondmy@kernel.org \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox