]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
RDMA/core: reduce stack using in nldev_stat_get_doit()
authorArnd Bergmann <arnd@arndb.de>
Fri, 20 Jun 2025 11:33:26 +0000 (13:33 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 20 Aug 2025 16:41:25 +0000 (18:41 +0200)
[ Upstream commit 43163f4c30f94d2103c948a247cdf2cda5068ca7 ]

In the s390 defconfig, gcc-10 and earlier end up inlining three functions
into nldev_stat_get_doit(), and each of them uses some 600 bytes of stack.

The result is a function with an overly large stack frame and a warning:

drivers/infiniband/core/nldev.c:2466:1: error: the frame size of 1720 bytes is larger than 1280 bytes [-Werror=frame-larger-than=]

Mark the three functions noinline_for_stack to prevent this, ensuring
that only one copy of the nlattr array is on the stack of each function.

Signed-off-by: Arnd Bergmann <arnd@arndb.de>
Link: https://patch.msgid.link/20250620113335.3776965-1-arnd@kernel.org
Signed-off-by: Leon Romanovsky <leon@kernel.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/infiniband/core/nldev.c

index be6b2ef0ede4eec09fe591b1792c146dae8b56e4..2220a2dfab240eaef2eb64d8e45cb221dfa25614 100644 (file)
@@ -1469,10 +1469,11 @@ static const struct nldev_fill_res_entry fill_entries[RDMA_RESTRACK_MAX] = {
 
 };
 
-static int res_get_common_doit(struct sk_buff *skb, struct nlmsghdr *nlh,
-                              struct netlink_ext_ack *extack,
-                              enum rdma_restrack_type res_type,
-                              res_fill_func_t fill_func)
+static noinline_for_stack int
+res_get_common_doit(struct sk_buff *skb, struct nlmsghdr *nlh,
+                   struct netlink_ext_ack *extack,
+                   enum rdma_restrack_type res_type,
+                   res_fill_func_t fill_func)
 {
        const struct nldev_fill_res_entry *fe = &fill_entries[res_type];
        struct nlattr *tb[RDMA_NLDEV_ATTR_MAX];
@@ -2263,10 +2264,10 @@ err:
        return ret;
 }
 
-static int stat_get_doit_default_counter(struct sk_buff *skb,
-                                        struct nlmsghdr *nlh,
-                                        struct netlink_ext_ack *extack,
-                                        struct nlattr *tb[])
+static noinline_for_stack int
+stat_get_doit_default_counter(struct sk_buff *skb, struct nlmsghdr *nlh,
+                             struct netlink_ext_ack *extack,
+                             struct nlattr *tb[])
 {
        struct rdma_hw_stats *stats;
        struct nlattr *table_attr;
@@ -2356,8 +2357,9 @@ err:
        return ret;
 }
 
-static int stat_get_doit_qp(struct sk_buff *skb, struct nlmsghdr *nlh,
-                           struct netlink_ext_ack *extack, struct nlattr *tb[])
+static noinline_for_stack int
+stat_get_doit_qp(struct sk_buff *skb, struct nlmsghdr *nlh,
+                struct netlink_ext_ack *extack, struct nlattr *tb[])
 
 {
        static enum rdma_nl_counter_mode mode;