]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
RDMA/hns: Fix ah error counter in sw stat not increasing
authorJunxian Huang <huangjunxian6@hisilicon.com>
Thu, 12 Sep 2024 11:57:00 +0000 (19:57 +0800)
committerLeon Romanovsky <leon@kernel.org>
Mon, 16 Sep 2024 08:21:58 +0000 (11:21 +0300)
There are several error cases where hns_roce_create_ah() returns
directly without jumping to sw stat path, thus leading to a problem
that the ah error counter does not increase.

Fixes: ee20cc17e9d8 ("RDMA/hns: Support DSCP")
Fixes: eb7854d63db5 ("RDMA/hns: Support SW stats with debugfs")
Signed-off-by: Junxian Huang <huangjunxian6@hisilicon.com>
Link: https://patch.msgid.link/20240912115700.2016443-1-huangjunxian6@hisilicon.com
Signed-off-by: Leon Romanovsky <leon@kernel.org>
drivers/infiniband/hw/hns/hns_roce_ah.c

index 3e02c474f59fec9261ca4e6a6be5c9818bcce6e2..4fc5b9d5fea87e1dfbb78425c8fddceec841b2e0 100644 (file)
@@ -64,8 +64,10 @@ int hns_roce_create_ah(struct ib_ah *ibah, struct rdma_ah_init_attr *init_attr,
        u8 tc_mode = 0;
        int ret;
 
-       if (hr_dev->pci_dev->revision == PCI_REVISION_ID_HIP08 && udata)
-               return -EOPNOTSUPP;
+       if (hr_dev->pci_dev->revision == PCI_REVISION_ID_HIP08 && udata) {
+               ret = -EOPNOTSUPP;
+               goto err_out;
+       }
 
        ah->av.port = rdma_ah_get_port_num(ah_attr);
        ah->av.gid_index = grh->sgid_index;
@@ -83,7 +85,7 @@ int hns_roce_create_ah(struct ib_ah *ibah, struct rdma_ah_init_attr *init_attr,
                ret = 0;
 
        if (ret && grh->sgid_attr->gid_type == IB_GID_TYPE_ROCE_UDP_ENCAP)
-               return ret;
+               goto err_out;
 
        if (tc_mode == HNAE3_TC_MAP_MODE_DSCP &&
            grh->sgid_attr->gid_type == IB_GID_TYPE_ROCE_UDP_ENCAP)
@@ -91,8 +93,10 @@ int hns_roce_create_ah(struct ib_ah *ibah, struct rdma_ah_init_attr *init_attr,
        else
                ah->av.sl = rdma_ah_get_sl(ah_attr);
 
-       if (!check_sl_valid(hr_dev, ah->av.sl))
-               return -EINVAL;
+       if (!check_sl_valid(hr_dev, ah->av.sl)) {
+               ret = -EINVAL;
+               goto err_out;
+       }
 
        memcpy(ah->av.dgid, grh->dgid.raw, HNS_ROCE_GID_SIZE);
        memcpy(ah->av.mac, ah_attr->roce.dmac, ETH_ALEN);