From 288a89df406d8c77b3e3d6a8ca375ef18b676769 Mon Sep 17 00:00:00 2001 From: Yixing Liu Date: Tue, 27 Sep 2022 19:06:00 +0800 Subject: [PATCH 12/12] libhns: Support DSCP This patch adds user mode DSCP function through the mapping of dscp-tc configured in kernel mode. Signed-off-by: Yixing Liu --- providers/hns/hns_roce_u.h | 7 +++++++ providers/hns/hns_roce_u_hw_v2.c | 11 ++++++++++- providers/hns/hns_roce_u_verbs.c | 3 +++ 3 files changed, 20 insertions(+), 1 deletion(-) diff --git a/providers/hns/hns_roce_u.h b/providers/hns/hns_roce_u.h index 6b64cd0..8c1cb1e 100644 --- a/providers/hns/hns_roce_u.h +++ b/providers/hns/hns_roce_u.h @@ -175,6 +175,11 @@ enum hns_roce_db_type { HNS_ROCE_DB_TYPE_NUM }; +enum hns_roce_tc_map_mode { + HNS_ROCE_TC_MAP_MODE_PRIO, + HNS_ROCE_TC_MAP_MODE_DSCP, +}; + struct hns_roce_db_page { struct hns_roce_db_page *prev, *next; struct hns_roce_buf buf; @@ -315,6 +320,8 @@ struct hns_roce_qp { unsigned int next_sge; int port_num; uint8_t sl; + uint8_t tc_mode; + uint8_t priority; unsigned int qkey; enum ibv_mtu path_mtu; diff --git a/providers/hns/hns_roce_u_hw_v2.c b/providers/hns/hns_roce_u_hw_v2.c index a30d461..c90a312 100644 --- a/providers/hns/hns_roce_u_hw_v2.c +++ b/providers/hns/hns_roce_u_hw_v2.c @@ -1545,6 +1545,7 @@ static int hns_roce_u_v2_modify_qp(struct ibv_qp *qp, struct ibv_qp_attr *attr, { int ret; struct ibv_modify_qp cmd; + struct hns_roce_modify_qp_ex_resp resp_ex = {}; struct hns_roce_qp *hr_qp = to_hr_qp(qp); bool flag = false; /* modify qp to error */ @@ -1564,8 +1565,13 @@ static int hns_roce_u_v2_modify_qp(struct ibv_qp *qp, struct ibv_qp_attr *attr, if (ret) return ret; - if (attr_mask & IBV_QP_STATE) + if (attr_mask & IBV_QP_STATE) { qp->state = attr->qp_state; + if (attr->qp_state == IBV_QPS_RTR) { + hr_qp->tc_mode = resp_ex.drv_payload.tc_mode; + hr_qp->priority = resp_ex.drv_payload.priority; + } + } if ((attr_mask & IBV_QP_STATE) && attr->qp_state == IBV_QPS_RESET) { if (qp->recv_cq) @@ -1579,6 +1585,9 @@ static int hns_roce_u_v2_modify_qp(struct ibv_qp *qp, struct ibv_qp_attr *attr, hns_roce_init_qp_indices(to_hr_qp(qp)); } + if (hr_qp->tc_mode == HNS_ROCE_TC_MAP_MODE_DSCP) + hr_qp->sl = hr_qp->priority; + record_qp_attr(qp, attr, attr_mask); return ret; diff --git a/providers/hns/hns_roce_u_verbs.c b/providers/hns/hns_roce_u_verbs.c index cff9d1d..a21c837 100644 --- a/providers/hns/hns_roce_u_verbs.c +++ b/providers/hns/hns_roce_u_verbs.c @@ -1483,6 +1483,9 @@ struct ibv_ah *hns_roce_u_create_ah(struct ibv_pd *pd, struct ibv_ah_attr *attr) if (ibv_resolve_eth_l2_from_gid(pd->context, attr, ah->av.mac, NULL)) goto err; + if (resp.tc_mode == HNS_ROCE_TC_MAP_MODE_DSCP) + ah->av.sl = resp.priority; + ah->av.udp_sport = get_ah_udp_sport(attr); return &ah->ibv_ah; -- 2.30.0