Hi, I just checked IB sepc. It looks like, IB spec in relevant chapter (11.4.2) doesn't have any requirement for qp_num to be valid in case of error. Only wr_id and status must be valid. I think, wr_id and status should be valid in existing implementation. struct rxe_cqe { union { struct ib_wc ibwc; struct ib_uverbs_wc uibwc; }; }; In both cases wr_id and status are in the same places So lines wc->wr_id = wqe->wr_id; wc->status = qp->resp.status set the valid values for rxe too. But I agree, that at the first glance, the code looks invalid and some refactoring can be done. Regards Sasha On 25/10/2018 22:40, Sagi Grimberg wrote: > Error completions must still contain a valid wr_id and > qp_num such that the consumer can rely on. Correctly > fill these fields in receive error completions. > > Reported-by: Walker Benjamin <benjamin.walker@xxxxxxxxx> > Cc: stable@xxxxxxxxxxxxxxx > Signed-off-by: Sagi Grimberg <sagi@xxxxxxxxxxx> > --- > drivers/infiniband/sw/rxe/rxe_resp.c | 13 +++++++++---- > 1 file changed, 9 insertions(+), 4 deletions(-) > > diff --git a/drivers/infiniband/sw/rxe/rxe_resp.c b/drivers/infiniband/sw/rxe/rxe_resp.c > index aa5833318372..3438f0653df0 100644 > --- a/drivers/infiniband/sw/rxe/rxe_resp.c > +++ b/drivers/infiniband/sw/rxe/rxe_resp.c > @@ -841,11 +841,16 @@ static enum resp_states do_complete(struct rxe_qp *qp, > > memset(&cqe, 0, sizeof(cqe)); > > - wc->wr_id = wqe->wr_id; > - wc->status = qp->resp.status; > - wc->qp = &qp->ibqp; > + if (qp->rcq->is_user) { > + uwc->status = qp->resp.status; > + uwc->qp_num = qp->ibqp.qp_num; > + uwc->wr_id = wqe->wr_id; > + } else { > + wc->status = qp->resp.status; > + wc->qp = &qp->ibqp; > + wc->wr_id = wqe->wr_id; > + } > > - /* fields after status are not required for errors */ > if (wc->status == IB_WC_SUCCESS) { > wc->opcode = (pkt->mask & RXE_IMMDT_MASK && > pkt->mask & RXE_WRITE_MASK) ? >