On Tue, Sep 08, 2026 at 01:51:02PM +0100, Kiryl Shutsemau wrote:
> +static void *mremapper_fn(void *arg)
> +{
> + unsigned int seed = (unsigned long)arg;
> +
> + while (!stop) {
> + void *p;
> +
> + p = mremap(mremap_area, hpage_pmd_size, hpage_pmd_size,
> + MREMAP_MAYMOVE | MREMAP_FIXED, mremap_scratch);
> + if (p == MAP_FAILED)
> + ksft_exit_fail_perror("mremap() away");
> + for (int i = 0; i < 8; i++)
> + mremap_scratch[(rand_r(&seed) %
> + (hpage_pmd_size / page_size)) * page_size] = 1;
> + p = mremap(mremap_scratch, hpage_pmd_size, hpage_pmd_size,
> + MREMAP_MAYMOVE | MREMAP_FIXED, mremap_area);
> + if (p == MAP_FAILED)
> + ksft_exit_fail_perror("mremap() back");
> + usleep(rand_r(&seed) % 2000);
> + }
> + return NULL;
> +}
Sashiko pointed out that mremap() freed scratch area and it has to be
re-reserved for next cycle.
Here's fixup:
diff --git a/tools/testing/selftests/mm/khugepaged_race.c
b/tools/testing/selftests/mm/khugepaged_race.c
index c3478b5123e2..ccfe655b3ddd 100644
--- a/tools/testing/selftests/mm/khugepaged_race.c
+++ b/tools/testing/selftests/mm/khugepaged_race.c
@@ -209,6 +209,11 @@ static void *mremapper_fn(void *arg)
MREMAP_MAYMOVE | MREMAP_FIXED, mremap_area);
if (p == MAP_FAILED)
ksft_exit_fail_perror("mremap() back");
+ /* The move back unmapped the scratch address: claim it again */
+ if (mmap(mremap_scratch, hpage_pmd_size, PROT_NONE,
+ MAP_ANONYMOUS | MAP_PRIVATE | MAP_FIXED_NOREPLACE,
+ -1, 0) != (void *)mremap_scratch)
+ ksft_exit_fail_perror("mmap() mremap scratch");
usleep(rand_r(&seed) % 2000);
}
return NULL;
--
Kiryl Shutsemau / Kirill A. Shutemov