diff mbox series

[1/1] svcrdma: dont unregister device for listening sockets

Message ID 20250206181534.3442-1-okorniev@redhat.com (mailing list archive)
State In Next
Delegated to: Chuck Lever
Headers show
Series [1/1] svcrdma: dont unregister device for listening sockets | expand

Commit Message

Olga Kornievskaia Feb. 6, 2025, 6:15 p.m. UTC
On an rdma-capable machine, a start/stop/start and then on a stop of
a knfsd server would lead kref underflow warning because svc_rdma_free
would indiscriminatory unregister the rdma device but a listerning
transport never call the rdma_rn_register() thus leading to kref
going down to 0 on the 1st stop of the server and on the 2nd stop
it leads a problem.

Suggested-by: Chuck Lever <chuck.lever@oracle.com>
Fixes: c4de97f7c454 ("svcrdma: Handle device removal outside of the CM event handler")
Signed-off-by: Olga Kornievskaia <okorniev@redhat.com>
---
 net/sunrpc/xprtrdma/svc_rdma_transport.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

Comments

Chuck Lever Feb. 6, 2025, 6:40 p.m. UTC | #1
From: Chuck Lever <chuck.lever@oracle.com>

On Thu, 06 Feb 2025 13:15:34 -0500, Olga Kornievskaia wrote:
> On an rdma-capable machine, a start/stop/start and then on a stop of
> a knfsd server would lead kref underflow warning because svc_rdma_free
> would indiscriminatory unregister the rdma device but a listerning
> transport never call the rdma_rn_register() thus leading to kref
> going down to 0 on the 1st stop of the server and on the 2nd stop
> it leads a problem.
> 
> [...]

Applied to nfsd-testing, thanks!

[1/1] svcrdma: dont unregister device for listening sockets
      commit: e7afce74443da1f330a4da6c099854a4ec02e572

--
Chuck Lever
diff mbox series

Patch

diff --git a/net/sunrpc/xprtrdma/svc_rdma_transport.c b/net/sunrpc/xprtrdma/svc_rdma_transport.c
index c3fbf0779d4a..aca8bdf65d72 100644
--- a/net/sunrpc/xprtrdma/svc_rdma_transport.c
+++ b/net/sunrpc/xprtrdma/svc_rdma_transport.c
@@ -621,7 +621,8 @@  static void __svc_rdma_free(struct work_struct *work)
 	/* Destroy the CM ID */
 	rdma_destroy_id(rdma->sc_cm_id);
 
-	rpcrdma_rn_unregister(device, &rdma->sc_rn);
+	if (!test_bit(XPT_LISTENER, &rdma->sc_xprt.xpt_flags))
+		rpcrdma_rn_unregister(device, &rdma->sc_rn);
 	kfree(rdma);
 }