]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
RDMA/hns: Fix unmatched condition in error path of alloc_user_qp_db()
authorJunxian Huang <huangjunxian6@hisilicon.com>
Tue, 11 Mar 2025 08:48:53 +0000 (16:48 +0800)
committerLeon Romanovsky <leon@kernel.org>
Wed, 12 Mar 2025 18:35:50 +0000 (14:35 -0400)
Currently the condition of unmapping sdb in error path is not exactly
the same as the condition of mapping in alloc_user_qp_db(). This may
cause a problem of unmapping an unmapped db in some case, such as
when the QP is XRC TGT. Unified the two conditions.

Fixes: 90ae0b57e4a5 ("RDMA/hns: Combine enable flags of qp")
Signed-off-by: Junxian Huang <huangjunxian6@hisilicon.com>
Link: https://patch.msgid.link/20250311084857.3803665-4-huangjunxian6@hisilicon.com
Signed-off-by: Leon Romanovsky <leon@kernel.org>
drivers/infiniband/hw/hns/hns_roce_qp.c

index 9e2e76c5940636f950dde236e39e4f030215e433..a97348a1c61f173ad15af55b0b537caaf901b9ff 100644 (file)
@@ -868,12 +868,14 @@ static int alloc_user_qp_db(struct hns_roce_dev *hr_dev,
                            struct hns_roce_ib_create_qp *ucmd,
                            struct hns_roce_ib_create_qp_resp *resp)
 {
+       bool has_sdb = user_qp_has_sdb(hr_dev, init_attr, udata, resp, ucmd);
        struct hns_roce_ucontext *uctx = rdma_udata_to_drv_context(udata,
                struct hns_roce_ucontext, ibucontext);
+       bool has_rdb = user_qp_has_rdb(hr_dev, init_attr, udata, resp);
        struct ib_device *ibdev = &hr_dev->ib_dev;
        int ret;
 
-       if (user_qp_has_sdb(hr_dev, init_attr, udata, resp, ucmd)) {
+       if (has_sdb) {
                ret = hns_roce_db_map_user(uctx, ucmd->sdb_addr, &hr_qp->sdb);
                if (ret) {
                        ibdev_err(ibdev,
@@ -884,7 +886,7 @@ static int alloc_user_qp_db(struct hns_roce_dev *hr_dev,
                hr_qp->en_flags |= HNS_ROCE_QP_CAP_SQ_RECORD_DB;
        }
 
-       if (user_qp_has_rdb(hr_dev, init_attr, udata, resp)) {
+       if (has_rdb) {
                ret = hns_roce_db_map_user(uctx, ucmd->db_addr, &hr_qp->rdb);
                if (ret) {
                        ibdev_err(ibdev,
@@ -898,7 +900,7 @@ static int alloc_user_qp_db(struct hns_roce_dev *hr_dev,
        return 0;
 
 err_sdb:
-       if (hr_qp->en_flags & HNS_ROCE_QP_CAP_SQ_RECORD_DB)
+       if (has_sdb)
                hns_roce_db_unmap_user(uctx, &hr_qp->sdb);
 err_out:
        return ret;