[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