svcrdma: do not unregister device for listeners
authorOlga Kornievskaia <okorniev@redhat.com>
Thu, 6 Feb 2025 18:15:34 +0000 (13:15 -0500)
committerChuck Lever <chuck.lever@oracle.com>
Mon, 10 Mar 2025 13:10:59 +0000 (09:10 -0400)
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 indiscriminately unregister the rdma device but a listening
transport never calls 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 to 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>
Cc: stable@vger.kernel.org
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
net/sunrpc/xprtrdma/svc_rdma_transport.c

index c3fbf0779d4ab65f41a9cd0f7f5c7b8b2e4d672e..aca8bdf65d729fd96ef7eff7eb0ffe2f97c36934 100644 (file)
@@ -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);
 }