Patch "svcrdma: Hold private mutex while invoking rdma_accept()" has been added to the 5.10-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    svcrdma: Hold private mutex while invoking rdma_accept()

to the 5.10-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     svcrdma-hold-private-mutex-while-invoking-rdma_accep.patch
and it can be found in the queue-5.10 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit 2be83adb068b4dc5550d4eee4a0ab77c7da1b498
Author: Chuck Lever <chuck.lever@xxxxxxxxxx>
Date:   Tue Feb 9 10:48:57 2021 -0500

    svcrdma: Hold private mutex while invoking rdma_accept()
    
    [ Upstream commit 0ac24c320c4d89a9de6ec802591398b8675c7b3c ]
    
    RDMA core mutex locking was restructured by commit d114c6feedfe
    ("RDMA/cma: Add missing locking to rdma_accept()") [Aug 2020]. When
    lock debugging is enabled, the RPC/RDMA server trips over the new
    lockdep assertion in rdma_accept() because it doesn't call
    rdma_accept() from its CM event handler.
    
    As a temporary fix, have svc_rdma_accept() take the handler_mutex
    explicitly. In the meantime, let's consider how to restructure the
    RPC/RDMA transport to invoke rdma_accept() from the proper context.
    
    Calls to svc_rdma_accept() are serialized with calls to
    svc_rdma_free() by the generic RPC server layer.
    
    Suggested-by: Jason Gunthorpe <jgg@xxxxxxxxxx>
    Link: https://lore.kernel.org/linux-rdma/20210209154014.GO4247@xxxxxxxxxx/
    Fixes: d114c6feedfe ("RDMA/cma: Add missing locking to rdma_accept()")
    Signed-off-by: Chuck Lever <chuck.lever@xxxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/net/sunrpc/xprtrdma/svc_rdma_transport.c b/net/sunrpc/xprtrdma/svc_rdma_transport.c
index fb044792b571c..5f7e3d12523fe 100644
--- a/net/sunrpc/xprtrdma/svc_rdma_transport.c
+++ b/net/sunrpc/xprtrdma/svc_rdma_transport.c
@@ -475,9 +475,6 @@ static struct svc_xprt *svc_rdma_accept(struct svc_xprt *xprt)
 	if (!svc_rdma_post_recvs(newxprt))
 		goto errout;
 
-	/* Swap out the handler */
-	newxprt->sc_cm_id->event_handler = svc_rdma_cma_handler;
-
 	/* Construct RDMA-CM private message */
 	pmsg.cp_magic = rpcrdma_cmp_magic;
 	pmsg.cp_version = RPCRDMA_CMP_VERSION;
@@ -498,7 +495,10 @@ static struct svc_xprt *svc_rdma_accept(struct svc_xprt *xprt)
 	}
 	conn_param.private_data = &pmsg;
 	conn_param.private_data_len = sizeof(pmsg);
+	rdma_lock_handler(newxprt->sc_cm_id);
+	newxprt->sc_cm_id->event_handler = svc_rdma_cma_handler;
 	ret = rdma_accept(newxprt->sc_cm_id, &conn_param);
+	rdma_unlock_handler(newxprt->sc_cm_id);
 	if (ret) {
 		trace_svcrdma_accept_err(newxprt, ret);
 		goto errout;



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux