]> git.ipfire.org Git - thirdparty/linux.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)
committerLeon Romanovsky <leon@kernel.org>
Wed, 25 Jun 2025 10:27:10 +0000 (06:27 -0400)
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>
drivers/infiniband/core/nldev.c

index a872643e8039fc182fd77fb1f0a6e8807697fdbb..e9b7a64192913a4ce37899a7a4f1bb343ac46a09 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;