]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
selftests/mm: fix child process exit codes in ksm_functional_tests
authorAboorva Devarajan <aboorvad@linux.ibm.com>
Sat, 16 Aug 2025 04:01:11 +0000 (09:31 +0530)
committerAndrew Morton <akpm@linux-foundation.org>
Fri, 12 Sep 2025 00:25:02 +0000 (17:25 -0700)
In ksm_functional_tests, test_child_ksm() returned negative values to
indicate errors.  However, when passed to exit(), these were interpreted
as large unsigned values (e.g, -2 became 254), leading to incorrect
handling in the parent process.  As a result, some tests appeared to be
skipped or silently failed.

This patch changes test_child_ksm() to return positive error codes (1, 2,
3) and updates test_child_ksm_err() to interpret them correctly.
Additionally, test_prctl_fork_exec() now uses exit(4) after a failed
execv() to clearly signal exec failures.  This ensures the parent
accurately detects and reports child process failures.

--------------
Before patch:
--------------
- [RUN] test_unmerge
ok 1 Pages were unmerged
...
- [RUN] test_prctl_fork
- No pages got merged
- [RUN] test_prctl_fork_exec
ok 7 PR_SET_MEMORY_MERGE value is inherited
...
Bail out! 1 out of 8 tests failed
- Planned tests != run tests (9 != 8)
- Totals: pass:7 fail:1 xfail:0 xpass:0 skip:0 error:0

--------------
After patch:
--------------
- [RUN] test_unmerge
ok 1 Pages were unmerged
...
- [RUN] test_prctl_fork
- No pages got merged
not ok 7 Merge in child failed
- [RUN] test_prctl_fork_exec
ok 8 PR_SET_MEMORY_MERGE value is inherited
...
Bail out! 2 out of 9 tests failed
- Totals: pass:7 fail:2 xfail:0 xpass:0 skip:0 error:0

Link: https://lkml.kernel.org/r/20250816040113.760010-6-aboorvad@linux.ibm.com
Fixes: 6c47de3be3a0 ("selftest/mm: ksm_functional_tests: extend test case for ksm fork/exec")
Co-developed-by: Donet Tom <donettom@linux.ibm.com>
Signed-off-by: Donet Tom <donettom@linux.ibm.com>
Signed-off-by: Aboorva Devarajan <aboorvad@linux.ibm.com>
Acked-by: David Hildenbrand <david@redhat.com>
Reviewed-by: Wei Yang <richard.weiyang@gmail.com>
Cc: Baolin Wang <baolin.wang@linux.alibaba.com>
Cc: Barry Song <baohua@kernel.org>
Cc: Dev Jain <dev.jain@arm.com>
Cc: Liam Howlett <liam.howlett@oracle.com>
Cc: Lorenzo Stoakes <lorenzo.stoakes@oracle.com>
Cc: Mariano Pache <npache@redhat.com>
Cc: "Ritesh Harjani (IBM)" <ritesh.list@gmail.com>
Cc: Ryan Roberts <ryan.roberts@arm.com>
Cc: Shuah Khan <shuah@kernel.org>
Cc: Zi Yan <ziy@nvidia.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
tools/testing/selftests/mm/ksm_functional_tests.c

index 996dc6645570d3878917b6054b0c4534cbc5f40e..534aa405cac704723f2f981625a40aac91d5d337 100644 (file)
@@ -512,14 +512,14 @@ static int test_child_ksm(void)
 
        /* Test if KSM is enabled for the process. */
        if (prctl(PR_GET_MEMORY_MERGE, 0, 0, 0, 0) != 1)
-               return -1;
+               return 1;
 
        /* Test if merge could really happen. */
        map = __mmap_and_merge_range(0xcf, size, PROT_READ | PROT_WRITE, KSM_MERGE_NONE);
        if (map == MAP_MERGE_FAIL)
-               return -2;
+               return 2;
        else if (map == MAP_MERGE_SKIP)
-               return -3;
+               return 3;
 
        ksm_unmerge();
        munmap(map, size);
@@ -528,12 +528,14 @@ static int test_child_ksm(void)
 
 static void test_child_ksm_err(int status)
 {
-       if (status == -1)
+       if (status == 1)
                ksft_test_result_fail("unexpected PR_GET_MEMORY_MERGE result in child\n");
-       else if (status == -2)
+       else if (status == 2)
                ksft_test_result_fail("Merge in child failed\n");
-       else if (status == -3)
+       else if (status == 3)
                ksft_test_result_skip("Merge in child skipped\n");
+       else if (status == 4)
+               ksft_test_result_fail("Binary not found\n");
 }
 
 /* Verify that prctl ksm flag is inherited. */
@@ -606,7 +608,7 @@ static void test_prctl_fork_exec(void)
                char *argv_for_program[] = { prg_name, FORK_EXEC_CHILD_PRG_NAME, NULL };
 
                execv(prg_name, argv_for_program);
-               return;
+               exit(4);
        }
 
        if (waitpid(child_pid, &status, 0) > 0) {