xref: /aosp_15_r20/external/linux-kselftest/tools/testing/selftests/memfd/common.c (revision 053f45be4e351dfd5e965df293cd45b779f579ee)
1*053f45beSAndroid Build Coastguard Worker // SPDX-License-Identifier: GPL-2.0
2*053f45beSAndroid Build Coastguard Worker #define _GNU_SOURCE
3*053f45beSAndroid Build Coastguard Worker #define __EXPORTED_HEADERS__
4*053f45beSAndroid Build Coastguard Worker 
5*053f45beSAndroid Build Coastguard Worker #include <stdio.h>
6*053f45beSAndroid Build Coastguard Worker #include <stdlib.h>
7*053f45beSAndroid Build Coastguard Worker #include <linux/fcntl.h>
8*053f45beSAndroid Build Coastguard Worker #include <linux/memfd.h>
9*053f45beSAndroid Build Coastguard Worker #include <unistd.h>
10*053f45beSAndroid Build Coastguard Worker #include <sys/syscall.h>
11*053f45beSAndroid Build Coastguard Worker 
12*053f45beSAndroid Build Coastguard Worker #include "common.h"
13*053f45beSAndroid Build Coastguard Worker 
14*053f45beSAndroid Build Coastguard Worker int hugetlbfs_test = 0;
15*053f45beSAndroid Build Coastguard Worker 
16*053f45beSAndroid Build Coastguard Worker /*
17*053f45beSAndroid Build Coastguard Worker  * Copied from mlock2-tests.c
18*053f45beSAndroid Build Coastguard Worker  */
default_huge_page_size(void)19*053f45beSAndroid Build Coastguard Worker unsigned long default_huge_page_size(void)
20*053f45beSAndroid Build Coastguard Worker {
21*053f45beSAndroid Build Coastguard Worker 	unsigned long hps = 0;
22*053f45beSAndroid Build Coastguard Worker 	char *line = NULL;
23*053f45beSAndroid Build Coastguard Worker 	size_t linelen = 0;
24*053f45beSAndroid Build Coastguard Worker 	FILE *f = fopen("/proc/meminfo", "r");
25*053f45beSAndroid Build Coastguard Worker 
26*053f45beSAndroid Build Coastguard Worker 	if (!f)
27*053f45beSAndroid Build Coastguard Worker 		return 0;
28*053f45beSAndroid Build Coastguard Worker 	while (getline(&line, &linelen, f) > 0) {
29*053f45beSAndroid Build Coastguard Worker 		if (sscanf(line, "Hugepagesize:       %lu kB", &hps) == 1) {
30*053f45beSAndroid Build Coastguard Worker 			hps <<= 10;
31*053f45beSAndroid Build Coastguard Worker 			break;
32*053f45beSAndroid Build Coastguard Worker 		}
33*053f45beSAndroid Build Coastguard Worker 	}
34*053f45beSAndroid Build Coastguard Worker 
35*053f45beSAndroid Build Coastguard Worker 	free(line);
36*053f45beSAndroid Build Coastguard Worker 	fclose(f);
37*053f45beSAndroid Build Coastguard Worker 	return hps;
38*053f45beSAndroid Build Coastguard Worker }
39*053f45beSAndroid Build Coastguard Worker 
sys_memfd_create(const char * name,unsigned int flags)40*053f45beSAndroid Build Coastguard Worker int sys_memfd_create(const char *name, unsigned int flags)
41*053f45beSAndroid Build Coastguard Worker {
42*053f45beSAndroid Build Coastguard Worker 	if (hugetlbfs_test)
43*053f45beSAndroid Build Coastguard Worker 		flags |= MFD_HUGETLB;
44*053f45beSAndroid Build Coastguard Worker 
45*053f45beSAndroid Build Coastguard Worker 	return syscall(__NR_memfd_create, name, flags);
46*053f45beSAndroid Build Coastguard Worker }
47