efa: Expose 64-bit request ID capability in query QP DV Expose the capability to post WRs with 64-bit request IDs directly without translation on query QP DV. Signed-off-by: Yonatan Nachum <ynachum@amazon.com>
diff --git a/providers/efa/efadv.h b/providers/efa/efadv.h index d863de4..4b28d1c 100644 --- a/providers/efa/efadv.h +++ b/providers/efa/efadv.h
@@ -106,6 +106,10 @@ struct efadv_qp_init_attr *efa_attr, uint32_t inlen); +enum { + EFADV_WQ_CAPS_64_BIT_REQ_ID = 1 << 0, +}; + struct efadv_wq_attr { uint64_t comp_mask; uint8_t *buffer; @@ -113,7 +117,8 @@ uint32_t num_entries; uint32_t *doorbell; uint32_t max_batch; - uint8_t reserved[4]; + uint16_t caps; + uint8_t reserved[2]; }; int efadv_query_qp_wqs(struct ibv_qp *ibvqp, struct efadv_wq_attr *sq_attr,
diff --git a/providers/efa/man/efadv_query_qp_wqs.3.md b/providers/efa/man/efadv_query_qp_wqs.3.md index 8a824a0..c975052 100644 --- a/providers/efa/man/efadv_query_qp_wqs.3.md +++ b/providers/efa/man/efadv_query_qp_wqs.3.md
@@ -35,7 +35,8 @@ uint32_t num_entries; uint32_t *doorbell; uint32_t max_batch; - uint8_t reserved[4]; + uint16_t caps; + uint8_t reserved[2]; }; ``` @@ -60,6 +61,14 @@ *max_batch* : Maximum batch size for queue submissions. +*caps* +: Work queue capabilities: + + EFADV_WQ_CAPS_64_BIT_REQ_ID + Work queue supports posting requests with 64-bit IDs. + When set, the associated completion queue is guaranteed + to return 64-bit request IDs as well. + # RETURN VALUE **efadv_query_qp_wqs()** returns 0 on success, or the value of errno on failure
diff --git a/providers/efa/verbs.c b/providers/efa/verbs.c index e21df3a..25981f5 100644 --- a/providers/efa/verbs.c +++ b/providers/efa/verbs.c
@@ -2426,6 +2426,12 @@ sq_attr->num_entries = qp->sq.wq.wqe_cnt; sq_attr->doorbell = qp->sq.wq.db; sq_attr->max_batch = qp->sq.max_batch_wr; + if (vext_field_avail(typeof(*sq_attr), reserved, inlen)) { + sq_attr->caps = 0; + memset(sq_attr->reserved, 0, sizeof(sq_attr->reserved)); + if (qp->sq.wq.req_id_64_bit) + sq_attr->caps |= EFADV_WQ_CAPS_64_BIT_REQ_ID; + } rq_attr->comp_mask = 0; rq_attr->buffer = qp->rq.buf; @@ -2433,6 +2439,10 @@ rq_attr->num_entries = qp->rq.wq.desc_mask + 1; rq_attr->doorbell = qp->rq.wq.db; rq_attr->max_batch = rq_attr->num_entries; + if (vext_field_avail(typeof(*rq_attr), reserved, inlen)) { + memset(rq_attr->reserved, 0, sizeof(rq_attr->reserved)); + rq_attr->caps = 0; + } return 0; }