From b0f0f28941777bd7a91258c190b1c8a7a100f029 Mon Sep 17 00:00:00 2001 From: Junxian Huang Date: Mon, 10 Nov 2025 11:45:11 +0800 Subject: [PATCH 1/3] RDMA/hns: Return actual error code instead of fixed EINVAL driver inclusion category: feature bugzilla: https://gitee.com/openeuler/kernel/issues/IDBC6I ---------------------------------------------------------------------- query_cqc() and query_mpt() may return various error codes in different cases. Return actual error code instead of fixed EINVAL. Fixes: 78163ff31523 ("RDMA/hns: Support CQ's restrack raw ops for hns driver") Fixes: 4d20406bc210 ("RDMA/hns: Support MR's restrack raw ops for hns driver") Signed-off-by: Junxian Huang Signed-off-by: Donghua Huang --- drivers/infiniband/hw/hns/hns_roce_restrack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/infiniband/hw/hns/hns_roce_restrack.c b/drivers/infiniband/hw/hns/hns_roce_restrack.c index 16152f77101a..bf500a0c5cfd 100644 --- a/drivers/infiniband/hw/hns/hns_roce_restrack.c +++ b/drivers/infiniband/hw/hns/hns_roce_restrack.c @@ -51,7 +51,7 @@ int hns_roce_fill_res_cq_entry_raw(struct sk_buff *msg, struct ib_cq *ib_cq) ret = hr_dev->hw->query_cqc(hr_dev, hr_cq->cqn, &context); if (ret) - return -EINVAL; + return ret; ret = nla_put(msg, RDMA_NLDEV_ATTR_RES_RAW, sizeof(context), &context); @@ -178,7 +178,7 @@ int hns_roce_fill_res_mr_entry_raw(struct sk_buff *msg, struct ib_mr *ib_mr) ret = hr_dev->hw->query_mpt(hr_dev, hr_mr->key, &context); if (ret) - return -EINVAL; + return ret; ret = nla_put(msg, RDMA_NLDEV_ATTR_RES_RAW, sizeof(context), &context); -- Gitee From ff156a242faaa4d11eba907c15aced2ab487428c Mon Sep 17 00:00:00 2001 From: Junxian Huang Date: Mon, 10 Nov 2025 14:17:17 +0800 Subject: [PATCH 2/3] RDMA/hns: Fix RoCEv1 failure due to DSCP driver inclusion category: feature bugzilla: https://gitee.com/openeuler/kernel/issues/IDBC6I ---------------------------------------------------------------------- DSCP is not supported in RoCEv1, but get_dscp() is still called. If get_dscp() returns an error, it'll eventually cause create_ah to fail even when using RoCEv1. Correct the return value and avoid calling get_dscp() when using RoCEv1. Fixes: 11ef2ec6aa7c ("RDMA/hns: Support DSCP of userspace") Signed-off-by: Junxian Huang Signed-off-by: Donghua Huang --- drivers/infiniband/hw/hns/hns_roce_ah.c | 22 +++++++++--------- drivers/infiniband/hw/hns/hns_roce_hw_v2.c | 26 +++++++++++----------- 2 files changed, 23 insertions(+), 25 deletions(-) diff --git a/drivers/infiniband/hw/hns/hns_roce_ah.c b/drivers/infiniband/hw/hns/hns_roce_ah.c index b618f733d1c7..5b031b63f8cd 100644 --- a/drivers/infiniband/hw/hns/hns_roce_ah.c +++ b/drivers/infiniband/hw/hns/hns_roce_ah.c @@ -78,19 +78,17 @@ int hns_roce_create_ah(struct ib_ah *ibah, struct rdma_ah_init_attr *init_attr, ah->av.udp_sport = get_ah_udp_sport(ah_attr); ah->av.tclass = get_tclass(grh); - ret = hr_dev->hw->get_dscp(hr_dev, get_tclass(grh), &tc_mode, - &priority); - if (ret == -EOPNOTSUPP) - ret = 0; + ah->av.sl = rdma_ah_get_sl(ah_attr); - if (ret && grh->sgid_attr->gid_type == IB_GID_TYPE_ROCE_UDP_ENCAP) - goto err_out; + if (grh->sgid_attr->gid_type == IB_GID_TYPE_ROCE_UDP_ENCAP) { + ret = hr_dev->hw->get_dscp(hr_dev, get_tclass(grh), &tc_mode, + &priority); + if (ret && ret != -EOPNOTSUPP) + return ret; - if (tc_mode == HNAE3_TC_MAP_MODE_DSCP && - grh->sgid_attr->gid_type == IB_GID_TYPE_ROCE_UDP_ENCAP) - ah->av.sl = priority; - else - ah->av.sl = rdma_ah_get_sl(ah_attr); + if (tc_mode == HNAE3_TC_MAP_MODE_DSCP) + ah->av.sl = priority; + } max_sl = min_t(u32, MAX_SERVICE_LEVEL, hr_dev->caps.sl_num - 1); if (unlikely(ah->av.sl > max_sl)) { @@ -126,7 +124,7 @@ int hns_roce_create_ah(struct ib_ah *ibah, struct rdma_ah_init_attr *init_attr, if (ret) atomic64_inc(&hr_dev->dfx_cnt[HNS_ROCE_DFX_AH_CREATE_ERR_CNT]); - return ret; + return 0; } int hns_roce_query_ah(struct ib_ah *ibah, struct rdma_ah_attr *ah_attr) diff --git a/drivers/infiniband/hw/hns/hns_roce_hw_v2.c b/drivers/infiniband/hw/hns/hns_roce_hw_v2.c index 6cd3e1d7e4fa..15d977a8a253 100644 --- a/drivers/infiniband/hw/hns/hns_roce_hw_v2.c +++ b/drivers/infiniband/hw/hns/hns_roce_hw_v2.c @@ -5338,20 +5338,20 @@ static int hns_roce_set_sl(struct ib_qp *ibqp, u32 sl_num; int ret; - ret = hns_roce_hw_v2_get_dscp(hr_dev, get_tclass(&attr->ah_attr.grh), - &hr_qp->tc_mode, &hr_qp->priority); - if (ret && ret != -EOPNOTSUPP && - grh->sgid_attr->gid_type == IB_GID_TYPE_ROCE_UDP_ENCAP) { - ibdev_err_ratelimited(ibdev, - "failed to get dscp, ret = %d.\n", ret); - return ret; - } + hr_qp->sl = rdma_ah_get_sl(&attr->ah_attr); + + if (grh->sgid_attr->gid_type == IB_GID_TYPE_ROCE_UDP_ENCAP) { + ret = hns_roce_hw_v2_get_dscp(hr_dev, + get_tclass(&attr->ah_attr.grh), + &hr_qp->tc_mode, &hr_qp->priority); + if (ret && ret != -EOPNOTSUPP) { + ibdev_err(ibdev, "failed to get dscp, ret = %d.\n", ret); + return ret; + } - if (hr_qp->tc_mode == HNAE3_TC_MAP_MODE_DSCP && - grh->sgid_attr->gid_type == IB_GID_TYPE_ROCE_UDP_ENCAP) - hr_qp->sl = hr_qp->priority; - else - hr_qp->sl = rdma_ah_get_sl(&attr->ah_attr); + if (hr_qp->tc_mode == HNAE3_TC_MAP_MODE_DSCP) + hr_qp->sl = hr_qp->priority; + } sl_num = min_t(u32, MAX_SERVICE_LEVEL, hr_dev->caps.sl_num - 1); if (unlikely(hr_qp->sl > sl_num)) { -- Gitee From 46270c12aa5a64d2a1c12ddbbe3e1d6c7101ee39 Mon Sep 17 00:00:00 2001 From: Junxian Huang Date: Mon, 10 Nov 2025 14:57:46 +0800 Subject: [PATCH 3/3] Revert "RDMA/hns: Fix mismatch exception rollback" driver inclusion category: feature bugzilla: https://gitee.com/openeuler/kernel/issues/IDBC6I ---------------------------------------------------------------------- This reverts commit 9c72576734dfcc9927c0539a1d332a9b185b5bdf. Should free the memory of chunk and dma buffer in error flow. Signed-off-by: Junxian Huang Signed-off-by: Donghua Huang --- drivers/infiniband/hw/hns/hns_roce_hem.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/infiniband/hw/hns/hns_roce_hem.c b/drivers/infiniband/hw/hns/hns_roce_hem.c index a8dccba39927..5b5272f8298e 100644 --- a/drivers/infiniband/hw/hns/hns_roce_hem.c +++ b/drivers/infiniband/hw/hns/hns_roce_hem.c @@ -277,7 +277,7 @@ static struct hns_roce_hem *hns_roce_alloc_hem(struct hns_roce_dev *hr_dev, return hem; fail: - kfree(hem); + hns_roce_free_hem(hr_dev, hem); return NULL; } -- Gitee