RDMA/rxe: Generate error completion for error requester QP state
authorLi Zhijian <lizhijian@fujitsu.com>
Wed, 20 Jul 2022 08:56:06 +0000 (04:56 -0400)
committerJason Gunthorpe <jgg@nvidia.com>
Tue, 2 Aug 2022 16:45:12 +0000 (13:45 -0300)
As per IBTA specification, all subsequent WQEs while QP is in error state
should be completed with a flush error.

Here we check QP_STATE_ERROR after req_next_wqe() so that rxe_completer()
has chance to be called where it will set CQ state to FLUSH ERROR and the
completion can associate with its WQE.

Link: https://lore.kernel.org/r/1658307368-1851-3-git-send-email-lizhijian@fujitsu.com
Signed-off-by: Li Zhijian <lizhijian@fujitsu.com>
Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
drivers/infiniband/sw/rxe/rxe_req.c

index 5a85687..f3bd071 100644 (file)
@@ -635,9 +635,20 @@ int rxe_requester(void *arg)
        if (!rxe_get(qp))
                return -EAGAIN;
 
-       if (unlikely(!qp->valid || qp->req.state == QP_STATE_ERROR))
+       if (unlikely(!qp->valid))
                goto exit;
 
+       if (unlikely(qp->req.state == QP_STATE_ERROR)) {
+               wqe = req_next_wqe(qp);
+               if (wqe)
+                       /*
+                        * Generate an error completion for error qp state
+                        */
+                       goto err;
+               else
+                       goto exit;
+       }
+
        if (unlikely(qp->req.state == QP_STATE_RESET)) {
                qp->req.wqe_index = queue_get_consumer(q,
                                                QUEUE_TYPE_FROM_CLIENT);