]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
RDMA/hns: Fix -Wframe-larger-than issue
authorJunxian Huang <huangjunxian6@hisilicon.com>
Thu, 3 Jul 2025 11:39:05 +0000 (19:39 +0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 15 Aug 2025 14:39:06 +0000 (16:39 +0200)
[ Upstream commit 79d56805c5068f2bc81518043e043c3dedd1c82a ]

Fix -Wframe-larger-than issue by allocating memory for qpc struct
with kzalloc() instead of using stack memory.

Fixes: 606bf89e98ef ("RDMA/hns: Refactor for hns_roce_v2_modify_qp function")
Reported-by: kernel test robot <lkp@intel.com>
Closes: https://lore.kernel.org/oe-kbuild-all/202506240032.CSgIyFct-lkp@intel.com/
Signed-off-by: Junxian Huang <huangjunxian6@hisilicon.com>
Link: https://patch.msgid.link/20250703113905.3597124-7-huangjunxian6@hisilicon.com
Signed-off-by: Leon Romanovsky <leon@kernel.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/infiniband/hw/hns/hns_roce_hw_v2.c

index 24664285915963b666aeaa91127b028f59d6cebf..b30dce00f2405abd48f988d4d6a7ccf00d9c669d 100644 (file)
@@ -5387,11 +5387,10 @@ static int hns_roce_v2_modify_qp(struct ib_qp *ibqp,
 {
        struct hns_roce_dev *hr_dev = to_hr_dev(ibqp->device);
        struct hns_roce_qp *hr_qp = to_hr_qp(ibqp);
-       struct hns_roce_v2_qp_context ctx[2];
-       struct hns_roce_v2_qp_context *context = ctx;
-       struct hns_roce_v2_qp_context *qpc_mask = ctx + 1;
+       struct hns_roce_v2_qp_context *context;
+       struct hns_roce_v2_qp_context *qpc_mask;
        struct ib_device *ibdev = &hr_dev->ib_dev;
-       int ret;
+       int ret = -ENOMEM;
 
        if (attr_mask & ~IB_QP_ATTR_STANDARD_BITS)
                return -EOPNOTSUPP;
@@ -5402,7 +5401,11 @@ static int hns_roce_v2_modify_qp(struct ib_qp *ibqp,
         * we should set all bits of the relevant fields in context mask to
         * 0 at the same time, else set them to 0x1.
         */
-       memset(context, 0, hr_dev->caps.qpc_sz);
+       context = kvzalloc(sizeof(*context), GFP_KERNEL);
+       qpc_mask = kvzalloc(sizeof(*qpc_mask), GFP_KERNEL);
+       if (!context || !qpc_mask)
+               goto out;
+
        memset(qpc_mask, 0xff, hr_dev->caps.qpc_sz);
 
        ret = hns_roce_v2_set_abs_fields(ibqp, attr, attr_mask, cur_state,
@@ -5444,6 +5447,8 @@ static int hns_roce_v2_modify_qp(struct ib_qp *ibqp,
                clear_qp(hr_qp);
 
 out:
+       kvfree(qpc_mask);
+       kvfree(context);
        return ret;
 }