in efawin/verbs.c [343:382]
static void efa_process_cqe(struct efa_cq *cq, struct ibv_wc *wc,
struct efa_qp *qp)
{
struct efa_io_cdesc_common *cqe = cq->cur_cqe;
uint32_t wrid_idx;
wc->status = to_ibv_status(cqe->status);
wc->vendor_err = cqe->status;
wc->wc_flags = 0;
wc->qp_num = cqe->qp_num;
if (EFA_GET(&cqe->flags, EFA_IO_CDESC_COMMON_Q_TYPE) ==
EFA_IO_SEND_QUEUE) {
cq->cur_wq = &qp->sq.wq;
wc->opcode = IBV_WC_SEND;
} else {
struct efa_io_rx_cdesc *rcqe =
container_of(cqe, struct efa_io_rx_cdesc, common);
cq->cur_wq = &qp->rq.wq;
wc->byte_len = cqe->length;
wc->opcode = IBV_WC_RECV;
wc->src_qp = rcqe->src_qp_num;
wc->sl = 0;
wc->slid = rcqe->ah;
if (EFA_GET(&cqe->flags, EFA_IO_CDESC_COMMON_HAS_IMM)) {
wc->imm_data = htobe32(rcqe->imm);
wc->wc_flags |= IBV_WC_WITH_IMM;
}
}
wrid_idx = cqe->req_id;
/* We do not have to take the WQ lock here,
* because this wrid index has not been freed yet,
* so there is no contention on this index.
*/
wc->wr_id = cq->cur_wq->wrid[wrid_idx];
}