Skip to content

Commit 1cccbd3

Browse files
201608ybsrleon
authored andcommitted
RDMA/erdma: Add the query_qp command to the cmdq
Certian QP attributes, such as sq_draining, can only be obtained by querying the hardware on the erdma RoCEv2 device. To address this, we add the query_qp command to the cmdq and parse the response to retrieve corresponding QP attributes. Signed-off-by: Boshi Yu <boshiyu@linux.alibaba.com> Link: https://patch.msgid.link/20241211020930.68833-8-boshiyu@linux.alibaba.com Reviewed-by: Cheng Xu <chengyou@linux.alibaba.com> Signed-off-by: Leon Romanovsky <leon@kernel.org>
1 parent de5b800 commit 1cccbd3

File tree

2 files changed

+60
-10
lines changed

2 files changed

+60
-10
lines changed

drivers/infiniband/hw/erdma/erdma_hw.h

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,7 @@ enum CMDQ_RDMA_OPCODE {
154154
CMDQ_OPCODE_SET_GID = 14,
155155
CMDQ_OPCODE_CREATE_AH = 15,
156156
CMDQ_OPCODE_DESTROY_AH = 16,
157+
CMDQ_OPCODE_QUERY_QP = 17,
157158
};
158159

159160
enum CMDQ_COMMON_OPCODE {
@@ -362,6 +363,17 @@ struct erdma_cmdq_mod_qp_req_rocev2 {
362363
struct erdma_av_cfg av_cfg;
363364
};
364365

366+
/* query qp response mask */
367+
#define ERDMA_CMD_QUERY_QP_RESP_SQ_PSN_MASK GENMASK_ULL(23, 0)
368+
#define ERDMA_CMD_QUERY_QP_RESP_RQ_PSN_MASK GENMASK_ULL(47, 24)
369+
#define ERDMA_CMD_QUERY_QP_RESP_QP_STATE_MASK GENMASK_ULL(55, 48)
370+
#define ERDMA_CMD_QUERY_QP_RESP_SQ_DRAINING_MASK GENMASK_ULL(56, 56)
371+
372+
struct erdma_cmdq_query_qp_req_rocev2 {
373+
u64 hdr;
374+
u32 qpn;
375+
};
376+
365377
/* create qp cfg0 */
366378
#define ERDMA_CMD_CREATE_QP_SQ_DEPTH_MASK GENMASK(31, 20)
367379
#define ERDMA_CMD_CREATE_QP_QPN_MASK GENMASK(19, 0)

drivers/infiniband/hw/erdma/erdma_verbs.c

Lines changed: 48 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1563,6 +1563,19 @@ static void erdma_attr_to_av(const struct rdma_ah_attr *ah_attr,
15631563
av->ntype = ERDMA_NETWORK_TYPE_IPV6;
15641564
}
15651565

1566+
static void erdma_av_to_attr(struct erdma_av *av, struct rdma_ah_attr *ah_attr)
1567+
{
1568+
ah_attr->type = RDMA_AH_ATTR_TYPE_ROCE;
1569+
1570+
rdma_ah_set_sl(ah_attr, av->sl);
1571+
rdma_ah_set_port_num(ah_attr, av->port);
1572+
rdma_ah_set_ah_flags(ah_attr, IB_AH_GRH);
1573+
1574+
rdma_ah_set_grh(ah_attr, NULL, av->flow_label, av->sgid_index,
1575+
av->hop_limit, av->traffic_class);
1576+
rdma_ah_set_dgid_raw(ah_attr, av->dgid);
1577+
}
1578+
15661579
static int ib_qps_to_erdma_qps[ERDMA_PROTO_COUNT][IB_QPS_ERR + 1] = {
15671580
[ERDMA_PROTO_IWARP] = {
15681581
[IB_QPS_RESET] = ERDMA_QPS_IWARP_IDLE,
@@ -1764,8 +1777,11 @@ static enum ib_qp_state query_qp_state(struct erdma_qp *qp)
17641777
int erdma_query_qp(struct ib_qp *ibqp, struct ib_qp_attr *qp_attr,
17651778
int qp_attr_mask, struct ib_qp_init_attr *qp_init_attr)
17661779
{
1780+
struct erdma_cmdq_query_qp_req_rocev2 req;
17671781
struct erdma_dev *dev;
17681782
struct erdma_qp *qp;
1783+
u64 resp;
1784+
int ret;
17691785

17701786
if (ibqp && qp_attr && qp_init_attr) {
17711787
qp = to_eqp(ibqp);
@@ -1792,8 +1808,37 @@ int erdma_query_qp(struct ib_qp *ibqp, struct ib_qp_attr *qp_attr,
17921808

17931809
qp_init_attr->cap = qp_attr->cap;
17941810

1795-
qp_attr->qp_state = query_qp_state(qp);
1796-
qp_attr->cur_qp_state = query_qp_state(qp);
1811+
if (erdma_device_rocev2(dev)) {
1812+
/* Query hardware to get some attributes */
1813+
erdma_cmdq_build_reqhdr(&req.hdr, CMDQ_SUBMOD_RDMA,
1814+
CMDQ_OPCODE_QUERY_QP);
1815+
req.qpn = QP_ID(qp);
1816+
1817+
ret = erdma_post_cmd_wait(&dev->cmdq, &req, sizeof(req), &resp,
1818+
NULL);
1819+
if (ret)
1820+
return ret;
1821+
1822+
qp_attr->sq_psn =
1823+
FIELD_GET(ERDMA_CMD_QUERY_QP_RESP_SQ_PSN_MASK, resp);
1824+
qp_attr->rq_psn =
1825+
FIELD_GET(ERDMA_CMD_QUERY_QP_RESP_RQ_PSN_MASK, resp);
1826+
qp_attr->qp_state = rocev2_to_ib_qps(
1827+
FIELD_GET(ERDMA_CMD_QUERY_QP_RESP_QP_STATE_MASK, resp));
1828+
qp_attr->cur_qp_state = qp_attr->qp_state;
1829+
qp_attr->sq_draining = FIELD_GET(
1830+
ERDMA_CMD_QUERY_QP_RESP_SQ_DRAINING_MASK, resp);
1831+
1832+
qp_attr->pkey_index = 0;
1833+
qp_attr->dest_qp_num = qp->attrs.rocev2.dst_qpn;
1834+
1835+
if (qp->ibqp.qp_type == IB_QPT_RC)
1836+
erdma_av_to_attr(&qp->attrs.rocev2.av,
1837+
&qp_attr->ah_attr);
1838+
} else {
1839+
qp_attr->qp_state = query_qp_state(qp);
1840+
qp_attr->cur_qp_state = qp_attr->qp_state;
1841+
}
17971842

17981843
return 0;
17991844
}
@@ -2185,14 +2230,7 @@ int erdma_query_ah(struct ib_ah *ibah, struct rdma_ah_attr *ah_attr)
21852230
struct erdma_ah *ah = to_eah(ibah);
21862231

21872232
memset(ah_attr, 0, sizeof(*ah_attr));
2188-
2189-
ah_attr->type = RDMA_AH_ATTR_TYPE_ROCE;
2190-
rdma_ah_set_sl(ah_attr, ah->av.sl);
2191-
rdma_ah_set_port_num(ah_attr, ah->av.port);
2192-
rdma_ah_set_ah_flags(ah_attr, IB_AH_GRH);
2193-
rdma_ah_set_grh(ah_attr, NULL, ah->av.flow_label, ah->av.sgid_index,
2194-
ah->av.hop_limit, ah->av.traffic_class);
2195-
rdma_ah_set_dgid_raw(ah_attr, ah->av.dgid);
2233+
erdma_av_to_attr(&ah->av, ah_attr);
21962234

21972235
return 0;
21982236
}

0 commit comments

Comments
 (0)