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


Reply via email to