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 |
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 --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); }
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(-)