Re: [PATCH 16/16] selftests/mm: Create MAP_BELOW_HINT test

Lorenzo Stoakes <[email protected]>
Newsgroups gmane.linux.ports.riscv,gmane.linux.kernel.cross-arch,gmane.linux.kernel,gmane.linux.ports.arm.kernel,gmane.linux.ports.ppc64.devel,gmane.linux.kernel.mm,gmane.linux.ports.mips,gmane.linux.ports.parisc,gmane.linux.ports.sh.devel,gmane.linux.ports.sparc
Message-ID <[email protected]>
On Tue, Aug 27, 2024 at 10:49:22PM GMT, Charlie Jenkins wrote:
> Add a selftest for MAP_BELOW_HINT that maps until it runs out of space
> below the hint address.
>
> Signed-off-by: Charlie Jenkins <[email protected]>
> ---
>  tools/testing/selftests/mm/Makefile         |  1 +
>  tools/testing/selftests/mm/map_below_hint.c | 29 +++++++++++++++++++++++++++++
>  2 files changed, 30 insertions(+)
>
> diff --git a/tools/testing/selftests/mm/Makefile b/tools/testing/selftests/mm/Makefile
> index cfad627e8d94..4e2de85267b5 100644
> --- a/tools/testing/selftests/mm/Makefile
> +++ b/tools/testing/selftests/mm/Makefile
> @@ -50,6 +50,7 @@ TEST_GEN_FILES += hugepage-shm
>  TEST_GEN_FILES += hugepage-vmemmap
>  TEST_GEN_FILES += khugepaged
>  TEST_GEN_FILES += madv_populate
> +TEST_GEN_FILES += map_below_hint
>  TEST_GEN_FILES += map_fixed_noreplace
>  TEST_GEN_FILES += map_hugetlb
>  TEST_GEN_FILES += map_populate
> diff --git a/tools/testing/selftests/mm/map_below_hint.c b/tools/testing/selftests/mm/map_below_hint.c
> new file mode 100644
> index 000000000000..305274c5af49
> --- /dev/null
> +++ b/tools/testing/selftests/mm/map_below_hint.c
> @@ -0,0 +1,29 @@
> +// SPDX-License-Identifier: GPL-2.0
> +/*
> + * Test the MAP_BELOW_HINT mmap flag.
> + */
> +#include <sys/mman.h>
> +#include "../kselftest.h"
> +
> +#define ADDR 0x1000000UL
> +#define LENGTH (ADDR / 100)
> +
> +#define MAP_BELOW_HINT	  0x8000000	/* Not defined in all libc */
> +
> +/*
> + * Map memory with MAP_BELOW_HINT until no memory left. Ensure that all returned
> + * addresses are below the hint.
> + */
> +int main(int argc, char **argv)
> +{
> +	void *addr;
> +
> +	do {
> +		addr = mmap((void *)ADDR, LENGTH, MAP_ANONYMOUS, MAP_BELOW_HINT, -1, 0);

How can this be correct? mmap() has parameters:

       void *mmap(void addr[.length], size_t length, int prot, int flags,
                  int fd, off_t offset);

You'r setting prot = MAP_ANONYMOUS, flags = MAP_BELOW_HINT...

This surely should be:

mmap(..., PROT_READ | PROT_WRITE, MAP_ANON | MAP_PRIVATE | MAP_BELOW_HINT, -1, 0);

> +	} while (addr == MAP_FAILED && (unsigned long)addr <= ADDR);

How can addr == MAP_FAILED (i.e. ~0) and addr <= ADDR? This will just loop
through once...

If you want to make sure you're getting mappings only below the hint until
you start getting MAP_FAILED's you'll need to handle this more robustly.

> +
> +	if (addr != MAP_FAILED && (unsigned long)addr > ADDR)
> +		ksft_exit_fail_msg("mmap returned address above hint with MAP_BELOW_HINT\n");

This is just going to fail because your flags are wrong then wrongly claim
to have passed...

> +
> +	ksft_test_result_pass("MAP_BELOW_HINT works\n");
> +}
>
> --
> 2.45.0
>
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.