@@ -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;
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@hpe.com> --- drivers/infiniband/sw/rxe/rxe_req.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-)