[PATCH 2/2] hugemmap35: add regression test for 49ccf2c3cafb
Andrea Cervesato <[email protected]>
| Newsgroups | gmane.linux.ltp |
|---|---|
| Message-ID | <[email protected]> |
From: Andrea Cervesato <andrea.cervesato-IBi9RG/[email protected]> Add a regression test verifying that a hugetlbfs file can be mapped with PROT_MTE even when MAP_HUGETLB is not set in the mmap() flags. Before the referenced commit, VM_MTE_ALLOWED was not set early enough for hugetlbfs file mappings, so such an mmap() was wrongly rejected. Signed-off-by: Andrea Cervesato <andrea.cervesato-IBi9RG/[email protected]> --- runtest/hugetlb | 1 + testcases/kernel/mem/.gitignore | 1 + testcases/kernel/mem/hugetlb/hugemmap/hugemmap35.c | 105 +++++++++++++++++++++ 3 files changed, 107 insertions(+) diff --git a/runtest/hugetlb b/runtest/hugetlb index 0896d3c941f068628f53c31197b293906c4ecba6..8ee0e6f828cb1954e03d67d40fe691d6521361bf 100644 --- a/runtest/hugetlb +++ b/runtest/hugetlb @@ -36,6 +36,7 @@ hugemmap30 hugemmap30 hugemmap31 hugemmap31 hugemmap32 hugemmap32 hugemmap34 hugemmap34 +hugemmap35 hugemmap35 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 b4455de51d6d6a9cc3d8b7ff392fc3ea9e95890a..0e59035dfdcf759aa16c069575bb1f4eb58f321c 100644 --- a/testcases/kernel/mem/.gitignore +++ b/testcases/kernel/mem/.gitignore @@ -36,6 +36,7 @@ /hugetlb/hugemmap/hugemmap31 /hugetlb/hugemmap/hugemmap32 /hugetlb/hugemmap/hugemmap34 +/hugetlb/hugemmap/hugemmap35 /hugetlb/hugeshmat/hugeshmat01 /hugetlb/hugeshmat/hugeshmat02 /hugetlb/hugeshmat/hugeshmat03 diff --git a/testcases/kernel/mem/hugetlb/hugemmap/hugemmap35.c b/testcases/kernel/mem/hugetlb/hugemmap/hugemmap35.c new file mode 100644 index 0000000000000000000000000000000000000000..1c11013e0de6b6dd870e3ffc48562912a44cf7f7 --- /dev/null +++ b/testcases/kernel/mem/hugetlb/hugemmap/hugemmap35.c @@ -0,0 +1,105 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* + * Copyright (C) 2026 SUSE LLC Andrea Cervesato <andrea.cervesato-IBi9RG/[email protected]> + */ + +/*\ + * Test that :manpage:`mmap(2)` accepts ``PROT_MTE`` for hugetlbfs file + * mappings that do not specify ``MAP_HUGETLB``. + * + * On arm64, hugetlbfs file mappings must get ``VM_MTE_ALLOWED`` before mmap + * flag validation. This is needed because mapping a hugetlbfs file does not + * have to use ``MAP_HUGETLB``. The test needs root to reserve huge pages and + * mount hugetlbfs. + */ + +#define _GNU_SOURCE + +#include "tst_test.h" +#include "hugetlb.h" +#include "lapi/mman.h" +#include "lapi/mmap.h" + +#define MNTPOINT "hugetlbfs/" + +static int fd = -1; +static long hpage_size; + +#define TC(x) {x, #x} + +static struct tcase { + int flags; + const char *desc; +} tcases[] = { + TC(MAP_SHARED), + TC(MAP_PRIVATE), +}; + +static void run(unsigned int n) +{ + struct tcase *tc = &tcases[n]; + volatile char *ptr; + + TESTPTR(mmap(NULL, hpage_size, PROT_READ | PROT_WRITE | PROT_MTE, + tc->flags, fd, 0)); + + if (TST_RET_PTR == MAP_FAILED) { + if (TST_ERR == ENOMEM) + tst_brk(TCONF, "Not enough huge pages"); + + tst_res(TFAIL | TTERRNO, "mmap(PROT_MTE, %s) without MAP_HUGETLB failed", + tc->desc); + return; + } + + ptr = TST_RET_PTR; + *ptr = 1; + + SAFE_MUNMAP(TST_RET_PTR, hpage_size); + + tst_res(TPASS, "mmap(PROT_MTE, %s) without MAP_HUGETLB passed", tc->desc); +} + +static void setup(void) +{ + hpage_size = tst_get_hugepage_size(); + if (!hpage_size) + tst_brk(TCONF, "Huge pages are not supported"); + + TESTPTR(mmap(NULL, hpage_size, PROT_READ | PROT_MTE, + MAP_PRIVATE | MAP_ANONYMOUS | MAP_HUGETLB, -1, 0)); + + if (TST_RET_PTR == MAP_FAILED) + tst_brk(TCONF | TTERRNO, "PROT_MTE is not supported with MAP_HUGETLB"); + + SAFE_MUNMAP(TST_RET_PTR, hpage_size); + + fd = tst_creat_unlinked(MNTPOINT, 0, 0600); + SAFE_FTRUNCATE(fd, hpage_size); +} + +static void cleanup(void) +{ + if (fd != -1) + SAFE_CLOSE(fd); +} + +static struct tst_test test = { + .test = run, + .setup = setup, + .cleanup = cleanup, + .tcnt = ARRAY_SIZE(tcases), + .needs_root = 1, + .needs_tmpdir = 1, + .mntpoint = MNTPOINT, + .needs_hugetlbfs = 1, + .hugepages = { 2, TST_NEEDS }, + .supported_archs = (const char *const []) { + "aarch64", + NULL + }, + .tags = (const struct tst_tag[]) { + {"linux-git", "49ccf2c3cafb"}, + {} + }, +}; -- 2.51.0 -- Mailing list info: https://lists.linux.it/listinfo/ltp