]> 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 10:13:53 +0000 (12:13 +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 5745231f9e3c9598cb18174cbc89120faf672481..53fe0ef3883d219b129fe2b6e5f1c43f8a7320e9 100644 (file)
@@ -5371,11 +5371,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;
@@ -5386,7 +5385,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,
@@ -5428,6 +5431,8 @@ static int hns_roce_v2_modify_qp(struct ib_qp *ibqp,
                clear_qp(hr_qp);
 
 out:
+       kvfree(qpc_mask);
+       kvfree(context);
        return ret;
 }