Fixed returned status so each error return can set status. Now the bind_mw verb returns the correct (error) status in the wc. Signed-off-by: Bob Pearson <rpearson@xxxxxxx> --- drivers/infiniband/sw/rxe/rxe_req.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/drivers/infiniband/sw/rxe/rxe_req.c b/drivers/infiniband/sw/rxe/rxe_req.c index b402eb82b402..e0564d7b0ff7 100644 --- a/drivers/infiniband/sw/rxe/rxe_req.c +++ b/drivers/infiniband/sw/rxe/rxe_req.c @@ -740,12 +740,14 @@ int rxe_requester(void *arg) skb = init_req_packet(qp, wqe, opcode, payload, &pkt); if (unlikely(!skb)) { pr_err("qp#%d Failed allocating skb\n", qp_num(qp)); + wqe->status = IB_WC_LOC_PROT_ERR; goto err; } if (fill_packet(qp, wqe, &pkt, skb, payload)) { pr_debug("qp#%d Error during fill packet\n", qp_num(qp)); kfree_skb(skb); + wqe->status = IB_WC_LOC_PROT_ERR; goto err; } @@ -769,6 +771,7 @@ int rxe_requester(void *arg) goto exit; } + wqe->status = IB_WC_LOC_PROT_ERR; // ?? FIXME goto err; } @@ -783,8 +786,10 @@ int rxe_requester(void *arg) * state and no more wqes will be processed unless * the qp is cleaned up and restarted. We do not want * to be called again */ - wqe->status = IB_WC_LOC_PROT_ERR; wqe->state = wqe_state_error; + // ?? we want to force the qp into error state before + // anyone else has a chance to process another wqe but + // this could collide with an already running completer __rxe_do_task(&qp->comp.task); ret = -EAGAIN; goto done; -- 2.25.1