]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
lib: test_objagg: split test_hints_case() into two functions
authorArnd Bergmann <arnd@arndb.de>
Fri, 20 Jun 2025 11:19:04 +0000 (13:19 +0200)
committerAndrew Morton <akpm@linux-foundation.org>
Thu, 10 Jul 2025 05:57:55 +0000 (22:57 -0700)
With sanitizers enabled, this function uses a lot of stack, causing a
harmless warning:

lib/test_objagg.c: In function 'test_hints_case.constprop':
lib/test_objagg.c:994:1: error: the frame size of 1440 bytes is larger than 1408 bytes [-Werror=frame-larger-than=]

Most of this is from the two 'struct world' structures.  Since most of the
work in this function is duplicated for the two, split it up into separate
functions that each use one of them.

The combined stack usage is still the same here, but there is no warning
any more, and the code is still safe because of the known call chain.

Link: https://lkml.kernel.org/r/20250620111907.3395296-1-arnd@kernel.org
Signed-off-by: Arnd Bergmann <arnd@arndb.de>
Cc: Jiri Pirko <jiri@resnulli.us>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
lib/test_objagg.c

index 222b39fc2629e2c6e5e9c545ab917e3da5473004..ce5c4c36a084d9c5d4ec6bc3e2f75711d32dbf1a 100644 (file)
@@ -908,50 +908,22 @@ static int check_expect_hints_stats(struct objagg_hints *objagg_hints,
        return err;
 }
 
-static int test_hints_case(const struct hints_case *hints_case)
+static int test_hints_case2(const struct hints_case *hints_case,
+                           struct objagg_hints *hints, struct objagg *objagg)
 {
        struct objagg_obj *objagg_obj;
-       struct objagg_hints *hints;
        struct world world2 = {};
-       struct world world = {};
        struct objagg *objagg2;
-       struct objagg *objagg;
        const char *errmsg;
        int i;
        int err;
 
-       objagg = objagg_create(&delta_ops, NULL, &world);
-       if (IS_ERR(objagg))
-               return PTR_ERR(objagg);
-
-       for (i = 0; i < hints_case->key_ids_count; i++) {
-               objagg_obj = world_obj_get(&world, objagg,
-                                          hints_case->key_ids[i]);
-               if (IS_ERR(objagg_obj)) {
-                       err = PTR_ERR(objagg_obj);
-                       goto err_world_obj_get;
-               }
-       }
-
-       pr_debug_stats(objagg);
-       err = check_expect_stats(objagg, &hints_case->expect_stats, &errmsg);
-       if (err) {
-               pr_err("Stats: %s\n", errmsg);
-               goto err_check_expect_stats;
-       }
-
-       hints = objagg_hints_get(objagg, OBJAGG_OPT_ALGO_SIMPLE_GREEDY);
-       if (IS_ERR(hints)) {
-               err = PTR_ERR(hints);
-               goto err_hints_get;
-       }
-
        pr_debug_hints_stats(hints);
        err = check_expect_hints_stats(hints, &hints_case->expect_stats_hints,
                                       &errmsg);
        if (err) {
                pr_err("Hints stats: %s\n", errmsg);
-               goto err_check_expect_hints_stats;
+               return err;
        }
 
        objagg2 = objagg_create(&delta_ops, hints, &world2);
@@ -983,7 +955,48 @@ err_world2_obj_get:
                world_obj_put(&world2, objagg, hints_case->key_ids[i]);
        i = hints_case->key_ids_count;
        objagg_destroy(objagg2);
-err_check_expect_hints_stats:
+
+       return err;
+}
+
+static int test_hints_case(const struct hints_case *hints_case)
+{
+       struct objagg_obj *objagg_obj;
+       struct objagg_hints *hints;
+       struct world world = {};
+       struct objagg *objagg;
+       const char *errmsg;
+       int i;
+       int err;
+
+       objagg = objagg_create(&delta_ops, NULL, &world);
+       if (IS_ERR(objagg))
+               return PTR_ERR(objagg);
+
+       for (i = 0; i < hints_case->key_ids_count; i++) {
+               objagg_obj = world_obj_get(&world, objagg,
+                                          hints_case->key_ids[i]);
+               if (IS_ERR(objagg_obj)) {
+                       err = PTR_ERR(objagg_obj);
+                       goto err_world_obj_get;
+               }
+       }
+
+       pr_debug_stats(objagg);
+       err = check_expect_stats(objagg, &hints_case->expect_stats, &errmsg);
+       if (err) {
+               pr_err("Stats: %s\n", errmsg);
+               goto err_check_expect_stats;
+       }
+
+       hints = objagg_hints_get(objagg, OBJAGG_OPT_ALGO_SIMPLE_GREEDY);
+       if (IS_ERR(hints)) {
+               err = PTR_ERR(hints);
+               goto err_hints_get;
+       }
+
+       err = test_hints_case2(hints_case, hints, objagg);
+
        objagg_hints_put(hints);
 err_hints_get:
 err_check_expect_stats: