summaryrefslogtreecommitdiff
path: root/tests/memfd_create.c
diff options
context:
space:
mode:
authorDmitry V. Levin <ldv@altlinux.org>2017-11-18 00:19:31 +0000
committerDmitry V. Levin <ldv@altlinux.org>2017-11-18 00:19:31 +0000
commit1898689dbf27c64fe54d9c612b4bccb7156fd074 (patch)
tree6244cb1615ee4247a57d5e4aa70df4e04e1505fc /tests/memfd_create.c
parentc75392f67a6518b8a55f0ed72de97172643bf20e (diff)
downloadstrace-1898689dbf27c64fe54d9c612b4bccb7156fd074.tar.gz
memfd_create: decode hugetlb page size
Decode alternative hugetlb page sizes introduced by kernel commit v4.14-rc1~126^2~17. * configure.ac (AC_CHECK_HEADERS): Add linux/memfd.h. * memfd_create.c [HAVE_LINUX_MEMFD_H]: Include it. [!MFD_HUGE_SHIFT] (MFD_HUGE_SHIFT): New macro. [!MFD_HUGE_MASK] (MFD_HUGE_MASK): Likewise. (SYS_FUNC(memfd_create)): Print hugetlb page size. * tests/memfd_create.c: Check it.
Diffstat (limited to 'tests/memfd_create.c')
-rw-r--r--tests/memfd_create.c37
1 files changed, 33 insertions, 4 deletions
diff --git a/tests/memfd_create.c b/tests/memfd_create.c
index 3daa8c9c1..8334af84b 100644
--- a/tests/memfd_create.c
+++ b/tests/memfd_create.c
@@ -37,6 +37,18 @@
# include <stdint.h>
# include <unistd.h>
+# ifdef HAVE_LINUX_MEMFD_H
+# include <linux/memfd.h>
+# endif
+
+# ifndef MFD_HUGE_SHIFT
+# define MFD_HUGE_SHIFT 26
+# endif
+
+# ifndef MFD_HUGE_MASK
+# define MFD_HUGE_MASK 0x3f
+# endif
+
static const char *errstr;
static long
@@ -51,17 +63,34 @@ int
main(void)
{
const size_t size = 255 - (sizeof("memfd:") - 1) + 1;
- char *const pattern = tail_alloc(size);
+ char *pattern = tail_alloc(size);
fill_memory_ex(pattern, size, '0', 10);
- const kernel_ulong_t flags = (kernel_ulong_t) 0xfacefeed0000000fULL;
- k_memfd_create((uintptr_t) pattern, flags);
+ k_memfd_create((uintptr_t) pattern, 0);
+ printf("memfd_create(\"%.*s\"..., 0) = %s\n",
+ (int) size - 1, pattern, errstr);
+ kernel_ulong_t flags = (kernel_ulong_t) 0xfacefeed00000007ULL;
+ k_memfd_create((uintptr_t) pattern, flags);
printf("memfd_create(\"%.*s\"..., %s) = %s\n",
(int) size - 1, pattern,
- "MFD_CLOEXEC|MFD_ALLOW_SEALING|MFD_HUGETLB|0x8",
+ "MFD_CLOEXEC|MFD_ALLOW_SEALING|MFD_HUGETLB",
errstr);
+ pattern[size - 1] = '\0';
+ flags = 30 << MFD_HUGE_SHIFT;
+ k_memfd_create((uintptr_t) pattern, flags);
+ printf("memfd_create(\"%s\", 30<<MFD_HUGE_SHIFT) = %s\n",
+ pattern, errstr);
+
+ pattern += size - 1;
+ flags = (kernel_ulong_t) -1ULL;
+ k_memfd_create(0, flags);
+ flags = -1U & ~(7 | (MFD_HUGE_MASK << MFD_HUGE_SHIFT));
+ printf("memfd_create(NULL, MFD_CLOEXEC|MFD_ALLOW_SEALING|MFD_HUGETLB"
+ "|%#x|%u<<MFD_HUGE_SHIFT) = %s\n",
+ (unsigned int) flags, MFD_HUGE_MASK, errstr);
+
puts("+++ exited with 0 +++");
return 0;
}