lkml.org 
[lkml]   [2022]   [Aug]   [15]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.18 0705/1095] RDMA/rxe: Fix deadlock in rxe_do_local_ops()
    Date
    From: Bob Pearson <rpearsonhpe@gmail.com>

    [ Upstream commit 7cb33d1bc1ac8e51fd88928f96674d392f8e07c4 ]

    When a local operation (invalidate mr, reg mr, bind mw) is finished there
    will be no ack packet coming from a responder to cause the wqe to be
    completed. This may happen anyway if a subsequent wqe performs
    IO. Currently if the wqe is signalled the completer tasklet is scheduled
    immediately but not otherwise.

    This leads to a deadlock if the next wqe has the fence bit set in send
    flags and the operation is not signalled. This patch removes the condition
    that the wqe must be signalled in order to schedule the completer tasklet
    which is the simplest fix for this deadlock and is fairly low cost. This
    is the analog for local operations of always setting the ackreq bit in all
    last or only request packets even if the operation is not signalled.

    Link: https://lore.kernel.org/r/20220523223251.15350-1-rpearsonhpe@gmail.com
    Reported-by: Jenny Hack <jhack@hpe.com>
    Fixes: c1a411268a4b ("RDMA/rxe: Move local ops to subroutine")
    Signed-off-by: Bob Pearson <rpearsonhpe@gmail.com>
    Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    drivers/infiniband/sw/rxe/rxe_req.c | 8 +++++---
    1 file changed, 5 insertions(+), 3 deletions(-)

    diff --git a/drivers/infiniband/sw/rxe/rxe_req.c b/drivers/infiniband/sw/rxe/rxe_req.c
    index 8a1cff80a68e..d574c47099b8 100644
    --- a/drivers/infiniband/sw/rxe/rxe_req.c
    +++ b/drivers/infiniband/sw/rxe/rxe_req.c
    @@ -586,9 +586,11 @@ static int rxe_do_local_ops(struct rxe_qp *qp, struct rxe_send_wqe *wqe)
    wqe->status = IB_WC_SUCCESS;
    qp->req.wqe_index = queue_next_index(qp->sq.queue, qp->req.wqe_index);

    - if ((wqe->wr.send_flags & IB_SEND_SIGNALED) ||
    - qp->sq_sig_type == IB_SIGNAL_ALL_WR)
    - rxe_run_task(&qp->comp.task, 1);
    + /* There is no ack coming for local work requests
    + * which can lead to a deadlock. So go ahead and complete
    + * it now.
    + */
    + rxe_run_task(&qp->comp.task, 1);

    return 0;
    }
    --
    2.35.1


    \
     
     \ /
      Last update: 2022-08-15 23:54    [W:2.905 / U:0.128 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site