in efawin/verbs.c [1646:1683]
static void efa_send_wr_set_sge_list(struct ibv_qp_ex *ibvqpx, size_t num_sge,
const struct ibv_sge *sg_list)
{
struct efa_qp *qp = to_efa_qp_ex(ibvqpx);
struct efa_io_rdma_req *rdma_req;
struct efa_io_tx_wqe *tx_wqe;
struct efa_sq *sq = &qp->sq;
uint8_t op_type;
if (unlikely(qp->wr_session_err))
return;
tx_wqe = sq->curr_tx_wqe;
op_type = EFA_GET(&tx_wqe->meta.ctrl1, EFA_IO_TX_META_DESC_OP_TYPE);
switch (op_type) {
case EFA_IO_SEND:
if (unlikely(num_sge > sq->wq.max_sge)) {
qp->wr_session_err = EINVAL;
return;
}
efa_post_send_sgl(tx_wqe->data.sgl, sg_list, num_sge);
break;
case EFA_IO_RDMA_READ:
if (unlikely(num_sge > sq->max_wr_rdma_sge)) {
qp->wr_session_err = EINVAL;
return;
}
rdma_req = &tx_wqe->data.rdma_req;
rdma_req->remote_mem.length = efa_sge_total_bytes(sg_list,
num_sge);
efa_post_send_sgl(rdma_req->local_mem, sg_list, num_sge);
break;
default:
return;
}
tx_wqe->meta.length = num_sge;
}