Patch "RDMA/rxe: Fix rxe_cq_post" has been added to the 6.3-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

    RDMA/rxe: Fix rxe_cq_post

to the 6.3-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:
     rdma-rxe-fix-rxe_cq_post.patch
and it can be found in the queue-6.3 subdirectory.

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



commit b8cfed029580ae1ff0175b0082dc5d024e631e9e
Author: Bob Pearson <rpearsonhpe@xxxxxxxxx>
Date:   Mon Jun 12 10:50:33 2023 -0500

    RDMA/rxe: Fix rxe_cq_post
    
    [ Upstream commit 0c7e314a6352664e12ec465f576cf039e95f8369 ]
    
    A recent patch replaced a tasklet execution of cq->comp_handler by a
    direct call. While this made sense it let changes to cq->notify state be
    unprotected and assumed that the cq completion machinery and the ulp done
    callbacks were reentrant. The result is that in some cases completion
    events can be lost. This patch moves the cq->comp_handler call inside of
    the spinlock in rxe_cq_post which solves both issues. This is compatible
    with the matching code in the request notify verb.
    
    Fixes: 78b26a335310 ("RDMA/rxe: Remove tasklet call from rxe_cq.c")
    Link: https://lore.kernel.org/r/20230612155032.17036-1-rpearsonhpe@xxxxxxxxx
    Signed-off-by: Bob Pearson <rpearsonhpe@xxxxxxxxx>
    Signed-off-by: Jason Gunthorpe <jgg@xxxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/drivers/infiniband/sw/rxe/rxe_cq.c b/drivers/infiniband/sw/rxe/rxe_cq.c
index 519ddec29b4ba..d6113329fee61 100644
--- a/drivers/infiniband/sw/rxe/rxe_cq.c
+++ b/drivers/infiniband/sw/rxe/rxe_cq.c
@@ -112,8 +112,6 @@ int rxe_cq_post(struct rxe_cq *cq, struct rxe_cqe *cqe, int solicited)
 
 	queue_advance_producer(cq->queue, QUEUE_TYPE_TO_CLIENT);
 
-	spin_unlock_irqrestore(&cq->cq_lock, flags);
-
 	if ((cq->notify == IB_CQ_NEXT_COMP) ||
 	    (cq->notify == IB_CQ_SOLICITED && solicited)) {
 		cq->notify = 0;
@@ -121,6 +119,8 @@ int rxe_cq_post(struct rxe_cq *cq, struct rxe_cqe *cqe, int solicited)
 		cq->ibcq.comp_handler(&cq->ibcq, cq->ibcq.cq_context);
 	}
 
+	spin_unlock_irqrestore(&cq->cq_lock, flags);
+
 	return 0;
 }
 



[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