]> 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)
committerJakub Kicinski <kuba@kernel.org>
Mon, 23 Jun 2025 23:57:43 +0000 (16: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.

Signed-off-by: Arnd Bergmann <arnd@arndb.de>
Link: https://patch.msgid.link/20250620111907.3395296-1-arnd@kernel.org
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
lib/test_objagg.c

index d34df4306b874f6d338acf5787fe880f96c3144c..a67b8ef5c5beb26f41a8cf298a5238f6c57b2f33 100644 (file)
@@ -906,50 +906,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);
@@ -981,7 +953,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: