[PATCH] selftests/mm: khugepaged: handle partial write in file_setup_area()

Vineet Agarwal
2026-04-28T06:24:14Z

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 <agarwal.vineet2006@gmail.com>
---
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;
+ }
close(fd);
munmap(p, size);
success("OK");
--
2.54.0