|  | // SPDX-License-Identifier: GPL-2.0 | 
|  | #define _GNU_SOURCE | 
|  | #define __EXPORTED_HEADERS__ | 
|  |  | 
|  | #include <stdio.h> | 
|  | #include <stdlib.h> | 
|  | #include <linux/fcntl.h> | 
|  | #include <linux/memfd.h> | 
|  | #include <unistd.h> | 
|  | #include <sys/syscall.h> | 
|  |  | 
|  | #include "common.h" | 
|  |  | 
|  | int hugetlbfs_test = 0; | 
|  |  | 
|  | /* | 
|  | * Copied from mlock2-tests.c | 
|  | */ | 
|  | unsigned long default_huge_page_size(void) | 
|  | { | 
|  | unsigned long hps = 0; | 
|  | char *line = NULL; | 
|  | size_t linelen = 0; | 
|  | FILE *f = fopen("/proc/meminfo", "r"); | 
|  |  | 
|  | if (!f) | 
|  | return 0; | 
|  | while (getline(&line, &linelen, f) > 0) { | 
|  | if (sscanf(line, "Hugepagesize:       %lu kB", &hps) == 1) { | 
|  | hps <<= 10; | 
|  | break; | 
|  | } | 
|  | } | 
|  |  | 
|  | free(line); | 
|  | fclose(f); | 
|  | return hps; | 
|  | } | 
|  |  | 
|  | int sys_memfd_create(const char *name, unsigned int flags) | 
|  | { | 
|  | if (hugetlbfs_test) | 
|  | flags |= MFD_HUGETLB; | 
|  |  | 
|  | return syscall(__NR_memfd_create, name, flags); | 
|  | } |