Re: [PATCH 1/6] mm/selftests: Fix virtual_address_range test issues.
From: Lorenzo Stoakes
Date: Wed Jun 18 2025 - 07:54:49 EST
On Wed, Jun 18, 2025 at 12:37:29PM +0100, Lorenzo Stoakes wrote:
> On Wed, Jun 18, 2025 at 04:58:56PM +0530, Dev Jain wrote:
> >
> > MAP_CHUNK_SIZE was chosen randomly. Good to see it translates into something logical : )
> >
To correct myself for being an idiot before, 256 x 4 KB is 1 MB not 1 GB
sorry :)
> > So I guess I am correct, if we can find two VMAs (except at the edge of the high addr boundary)
> > with a gap of greater than MAP_CHUNK_SIZE then there is a bug in mmap().
>
> No haha, not at all!! Firstly fixed addressed override a lot of this, secondly
> the 256 page gap (which is configurable btw) is only applicable for mappings
> below a stack (in stack grow down arch).
>
> This assumption is totally incorrect, sorry. I'd suggest making assertions about
> this is really not all that useful, as things vary by arch and kernel
> configuration.
You can play with this program to see what happens in reality.
On my system the mappings of first two VMAs are immediately adjacent, then
the other is >1MB below:
#include <stdio.h>
#include <stdlib.h>
#include <sys/mman.h>
int main()
{
char *ptr;
ptr = mmap(NULL, 4096, PROT_READ | PROT_WRITE, MAP_ANON | MAP_PRIVATE, -1, 0);
if (ptr == MAP_FAILED) {
perror("mmap 1");
return EXIT_FAILURE;
}
printf("ptr1 = %p\n", ptr);
ptr = mmap(NULL, 4096, PROT_READ | PROT_WRITE, MAP_ANON | MAP_PRIVATE | MAP_GROWSDOWN, -1, 0);
if (ptr == MAP_FAILED) {
perror("mmap 2");
return EXIT_FAILURE;
}
printf("ptr2 = %p\n", ptr);
ptr = mmap(NULL, 4096, PROT_READ | PROT_WRITE, MAP_ANON | MAP_PRIVATE, -1, 0);
if (ptr == MAP_FAILED) {
perror("mmap 3");
return EXIT_FAILURE;
}
printf("ptr3 = %p\n", ptr);
return EXIT_SUCCESS;
}
The definitive answers are in the get unmapped area logic.
But again not very useful to test imo beyond hand-wavey basics (and you
have to check that against all arches to be sure your hand waving is always
true :)