[LTP] [PATCH 06/13] Hugetlb: Migrating libhugetlbfs mremap-fixed-normal-near-huge

Li Wang liwang@redhat.com
Tue Dec 27 07:31:07 CET 2022


On Sun, Dec 25, 2022 at 11:42 PM Tarun Sahu <tsahu@linux.ibm.com> wrote:

> Migrating the libhugetlbfs/testcases/mremap-fixed-normal-near-huge.c test
>
> Test Description: The kernel has bug for mremap() on some architecture.
> mremap() can cause crashes on architectures with holes in the address
> space (like ia64) and on powerpc with it's distinct page size "slices".
>
> This test get the huge mapping address and mremap() normal mapping
> near to this huge mapping.
>
> Signed-off-by: Tarun Sahu <tsahu@linux.ibm.com>
> ---
>  runtest/hugetlb                               |   1 +
>  testcases/kernel/mem/.gitignore               |   1 +
>  .../kernel/mem/hugetlb/hugemmap/hugemmap26.c  | 131 ++++++++++++++++++
>  3 files changed, 133 insertions(+)
>  create mode 100644 testcases/kernel/mem/hugetlb/hugemmap/hugemmap26.c
>
> diff --git a/runtest/hugetlb b/runtest/hugetlb
> index 65265b0fe..55185f2f7 100644
> --- a/runtest/hugetlb
> +++ b/runtest/hugetlb
> @@ -26,6 +26,7 @@ hugemmap21 hugemmap21
>  hugemmap22 hugemmap22
>  hugemmap23 hugemmap23
>  hugemmap25 hugemmap25
> +hugemmap26 hugemmap26
>  hugemmap05_1 hugemmap05 -m
>  hugemmap05_2 hugemmap05 -s
>  hugemmap05_3 hugemmap05 -s -m
> diff --git a/testcases/kernel/mem/.gitignore
> b/testcases/kernel/mem/.gitignore
> index c865a1e55..4886c6a5f 100644
> --- a/testcases/kernel/mem/.gitignore
> +++ b/testcases/kernel/mem/.gitignore
> @@ -25,6 +25,7 @@
>  /hugetlb/hugemmap/hugemmap22
>  /hugetlb/hugemmap/hugemmap23
>  /hugetlb/hugemmap/hugemmap25
> +/hugetlb/hugemmap/hugemmap26
>  /hugetlb/hugeshmat/hugeshmat01
>  /hugetlb/hugeshmat/hugeshmat02
>  /hugetlb/hugeshmat/hugeshmat03
> diff --git a/testcases/kernel/mem/hugetlb/hugemmap/hugemmap26.c
> b/testcases/kernel/mem/hugetlb/hugemmap/hugemmap26.c
> new file mode 100644
> index 000000000..03dd248bd
> --- /dev/null
> +++ b/testcases/kernel/mem/hugetlb/hugemmap/hugemmap26.c
> @@ -0,0 +1,131 @@
> +// SPDX-License-Identifier: LGPL-2.1-or-later
> +/*
> + * Copyright (C) 2009 IBM Corporation.
> + * Author: David Gibson
> + */
> +
> +/*\
> + * [Description]
> + *
> + * Test Description: The kernel has bug for mremap() on some architecture.
> + * mremap() can cause crashes on architectures with holes in the address
> + * space (like ia64) and on powerpc with it's distinct page size "slices".
> + *
> + * This test get the huge mapping address and mremap() normal mapping
> + * near to this huge mapping.
> + */
> +
> +#define _GNU_SOURCE
> +#include <stdio.h>
> +#include <sys/mount.h>
> +#include <limits.h>
> +#include <sys/param.h>
> +#include <sys/types.h>
> +
> +#include "hugetlb.h"
> +
> +#define RANDOM_CONSTANT        0x1234ABCD
> +#define MNTPOINT "hugetlbfs/"
> +
> +static int  fd = -1;
> +static long hpage_size, page_size;
> +
> +static int do_readback(void *p, size_t size, const char *stage)
> +{
> +       unsigned int *q = p;
> +       size_t i;
> +
> +       tst_res(TINFO, "%s(%p, 0x%lx, \"%s\")", __func__, p,
> +              (unsigned long)size, stage);
> +
> +       for (i = 0; i < (size / sizeof(*q)); i++)
> +               q[i] = RANDOM_CONSTANT ^ i;
> +
> +       for (i = 0; i < (size / sizeof(*q)); i++) {
> +               if (q[i] != (RANDOM_CONSTANT ^ i)) {
> +                       tst_res(TFAIL, "Stage \"%s\": Mismatch at offset
> 0x%lx: 0x%x "
> +                                       "instead of 0x%lx", stage, i,
> q[i], RANDOM_CONSTANT ^ i);
> +                       return -1;
> +               }
> +       }
> +       return 0;
> +}
> +
> +static int do_remap(void *target)
> +{
> +       void *a, *b;
> +       int ret;
> +
> +       a = SAFE_MMAP(NULL, page_size, PROT_READ|PROT_WRITE,
> +                 MAP_SHARED|MAP_ANONYMOUS, -1, 0);
> +
> +       ret = do_readback(a, page_size, "base normal");
> +       if (ret)
> +               goto cleanup;
> +       b = mremap(a, page_size, page_size, MREMAP_MAYMOVE | MREMAP_FIXED,
> +                  target);
> +
> +       if (b != MAP_FAILED) {
> +               do_readback(b, page_size, "remapped");
> +               a = b;
> +       } else
> +               tst_res(TINFO|TERRNO, "mremap(MAYMOVE|FIXED) disallowed");
> +
> +cleanup:
> +       SAFE_MUNMAP(a, page_size);
> +       return ret;
> +}
>

Those two functions do_readback() and do_remap() are
copy&past from hugemmap2[4|5].c, what about extracting
them into a common header file(tst_hugetlb.h or mem.h) for
easy reusing?

And I also noticed other tests (hugemmap27) using the same
macro mem barrier(), it'd be great to define it in a header file.


-- 
Regards,
Li Wang


More information about the ltp mailing list