On 4/28/26 08:23, Vineet Agarwal wrote:
> file_setup_area() writes initialized test data into the backing
> file used for collapse testing, but it ignores the return value
> from write().
> 
> If write() fails or completes only partially, the test continues
> with incomplete file contents, which can lead to incorrect test
> results and make failures harder to diagnose.
> 
> Handle partial writes by retrying until all data is written and
> abort the test if write() fails.
> 
> Signed-off-by: Vineet Agarwal <[email protected]>
> ---
>  tools/testing/selftests/mm/khugepaged.c | 18 ++++++++++++++++--
>  1 file changed, 16 insertions(+), 2 deletions(-)
> 
> diff --git a/tools/testing/selftests/mm/khugepaged.c 
> b/tools/testing/selftests/mm/khugepaged.c
> index 3fe7ef04ac62..c13f06758750 100644
> --- a/tools/testing/selftests/mm/khugepaged.c
> +++ b/tools/testing/selftests/mm/khugepaged.c
> @@ -369,7 +369,9 @@ static void *file_setup_area(int nr_hpages)
>       int fd;
>       void *p;
>       unsigned long size;
> -
> +     size_t remaining;
> +     ssize_t ret;
> +     char *buf;
>       unlink(finfo.path);  /* Cleanup from previous failed tests */
>       printf("Creating %s for collapse%s...", finfo.path,
>              finfo.type == VMA_SHMEM ? " (tmpfs)" : "");
> @@ -383,7 +385,19 @@ static void *file_setup_area(int nr_hpages)
>       size = nr_hpages * hpage_pmd_size;
>       p = alloc_mapping(nr_hpages);
>       fill_memory(p, 0, size);
> -     write(fd, p, size);
> +     remaining = size;
> +     buf = p;
> +
> +     while (remaining > 0) {
> +             ret = write(fd, buf, remaining);
> +             if (ret <= 0) {
> +                     close(fd);
> +                     munmap(p, size);
> +                     ksft_exit_fail_msg("write() failed while preparing test 
> file\n");
> +             }
> +             buf += ret;
> +             remaining -= ret;
> +     }

Why are we even using write() instead of just mapping the fd and writing to that
area?

diff --git a/tools/testing/selftests/mm/khugepaged.c
b/tools/testing/selftests/mm/khugepaged.c
index 3fe7ef04ac62..a77f753ccf38 100644
--- a/tools/testing/selftests/mm/khugepaged.c
+++ b/tools/testing/selftests/mm/khugepaged.c
@@ -381,9 +381,10 @@ static void *file_setup_area(int nr_hpages)
        }

        size = nr_hpages * hpage_pmd_size;
-       p = alloc_mapping(nr_hpages);
+       p = mmap(BASE_ADDR, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
+       if (p != BASE_ADDR)
+               ksft_exit_fail_msg("mmap() failed while preparing test file\n");
        fill_memory(p, 0, size);
-       write(fd, p, size);
        close(fd);
        munmap(p, size);
        success("OK");


-- 
Cheers,

David

Reply via email to