OSDN Git Service

bpf/tests: Reduce memory footprint of test suite
authorJohan Almbladh <johan.almbladh@anyfinetworks.com>
Tue, 14 Sep 2021 09:18:30 +0000 (11:18 +0200)
committerDaniel Borkmann <daniel@iogearbox.net>
Tue, 28 Sep 2021 07:26:28 +0000 (09:26 +0200)
The test suite used to call any fill_helper callbacks to generate eBPF
program data for all test cases at once. This caused ballooning memory
requirements as more extensive test cases were added. Now the each
fill_helper is called before the test is run and the allocated memory
released afterwards, before the next test case is processed.

Signed-off-by: Johan Almbladh <johan.almbladh@anyfinetworks.com>
Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
Link: https://lore.kernel.org/bpf/20210914091842.4186267-3-johan.almbladh@anyfinetworks.com
lib/test_bpf.c

index a406cbb..c865fd5 100644 (file)
@@ -8694,8 +8694,6 @@ static __init int find_test_index(const char *test_name)
 
 static __init int prepare_bpf_tests(void)
 {
-       int i;
-
        if (test_id >= 0) {
                /*
                 * if a test_id was specified, use test_range to
@@ -8739,23 +8737,11 @@ static __init int prepare_bpf_tests(void)
                }
        }
 
-       for (i = 0; i < ARRAY_SIZE(tests); i++) {
-               if (tests[i].fill_helper &&
-                   tests[i].fill_helper(&tests[i]) < 0)
-                       return -ENOMEM;
-       }
-
        return 0;
 }
 
 static __init void destroy_bpf_tests(void)
 {
-       int i;
-
-       for (i = 0; i < ARRAY_SIZE(tests); i++) {
-               if (tests[i].fill_helper)
-                       kfree(tests[i].u.ptr.insns);
-       }
 }
 
 static bool exclude_test(int test_id)
@@ -8960,7 +8946,19 @@ static __init int test_bpf(void)
 
                pr_info("#%d %s ", i, tests[i].descr);
 
+               if (tests[i].fill_helper &&
+                   tests[i].fill_helper(&tests[i]) < 0) {
+                       pr_cont("FAIL to prog_fill\n");
+                       continue;
+               }
+
                fp = generate_filter(i, &err);
+
+               if (tests[i].fill_helper) {
+                       kfree(tests[i].u.ptr.insns);
+                       tests[i].u.ptr.insns = NULL;
+               }
+
                if (fp == NULL) {
                        if (err == 0) {
                                pass_cnt++;