diff options
author | Li Zhijian <lizhijian@fujitsu.com> | 2022-07-20 11:56:06 +0300 |
---|---|---|
committer | Jason Gunthorpe <jgg@nvidia.com> | 2022-08-02 19:45:12 +0300 |
commit | ae720bdb703b295fed4ded28e14dd06a534a3012 (patch) | |
tree | 321c952586fed44addb314f2fe71921bed45db89 /drivers/infiniband/sw/rxe/rxe_req.c | |
parent | dea4266f7bf2fc76e49b2e521feccd6c1dbca8c5 (diff) | |
download | linux-ae720bdb703b295fed4ded28e14dd06a534a3012.tar.xz |
RDMA/rxe: Generate error completion for error requester QP state
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>
Diffstat (limited to 'drivers/infiniband/sw/rxe/rxe_req.c')
-rw-r--r-- | drivers/infiniband/sw/rxe/rxe_req.c | 13 |
1 files changed, 12 insertions, 1 deletions
diff --git a/drivers/infiniband/sw/rxe/rxe_req.c b/drivers/infiniband/sw/rxe/rxe_req.c index 5a85687b9c72..f3bd071d3e7e 100644 --- a/drivers/infiniband/sw/rxe/rxe_req.c +++ b/drivers/infiniband/sw/rxe/rxe_req.c @@ -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); |