Neither hint may be applied to hugetlb memory, so madvise(2) must fail with EINVAL for a hugetlb VMA. Locked VMAs are already checked here and PFNMAP VMAs by the pfnmap test.
Check the hugetlb case for both hints. Signed-off-by: Gregory Price (Meta) <[email protected]> --- tools/testing/selftests/mm/madvise.c | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/tools/testing/selftests/mm/madvise.c b/tools/testing/selftests/mm/madvise.c index f122154fac05..bd78f63f1314 100644 --- a/tools/testing/selftests/mm/madvise.c +++ b/tools/testing/selftests/mm/madvise.c @@ -127,6 +127,29 @@ TEST_F(madvise, locked_vma_is_rejected) ASSERT_EQ(munmap(mapping, page_size), 0); } +/* Neither hint may be applied to hugetlb memory. */ +TEST_F(madvise, hugetlb_vma_is_rejected) +{ + size_t size = default_huge_page_size(); + char *mapping; + + if (!size) + SKIP(return, "hugetlb is not supported"); + mapping = mmap(NULL, size, PROT_READ | PROT_WRITE, + MAP_PRIVATE | MAP_ANONYMOUS | MAP_HUGETLB, -1, 0); + if (mapping == MAP_FAILED) + SKIP(return, "no hugetlb pages are available"); + mapping[0] = 1; + + ASSERT_EQ(madvise(mapping, size, MADV_COLD), -1); + ASSERT_EQ(errno, EINVAL); + ASSERT_EQ(madvise(mapping, size, MADV_PAGEOUT), -1); + ASSERT_EQ(errno, EINVAL); + ASSERT_EQ(mapping[0], 1); + + ASSERT_EQ(munmap(mapping, size), 0); +} + /* A zero-length range is accepted. */ TEST_F(madvise, zero_length_is_accepted) { -- 2.56.0

