xref: /linux/tools/testing/selftests/mm/on-fault-limit.c (revision 4b660dbd9ee2059850fd30e0df420ca7a38a1856)
1 // SPDX-License-Identifier: GPL-2.0
2 #include <sys/mman.h>
3 #include <stdio.h>
4 #include <unistd.h>
5 #include <string.h>
6 #include <sys/time.h>
7 #include <sys/resource.h>
8 #include "../kselftest.h"
9 
10 static void test_limit(void)
11 {
12 	struct rlimit lims;
13 	void *map;
14 
15 	if (getrlimit(RLIMIT_MEMLOCK, &lims))
16 		ksft_exit_fail_msg("getrlimit: %s\n", strerror(errno));
17 
18 	if (mlockall(MCL_ONFAULT | MCL_FUTURE))
19 		ksft_exit_fail_msg("mlockall: %s\n", strerror(errno));
20 
21 	map = mmap(NULL, 2 * lims.rlim_max, PROT_READ | PROT_WRITE,
22 		   MAP_PRIVATE | MAP_ANONYMOUS | MAP_POPULATE, -1, 0);
23 
24 	ksft_test_result(map == MAP_FAILED, "The map failed respecting mlock limits\n");
25 
26 	if (map != MAP_FAILED)
27 		munmap(map, 2 * lims.rlim_max);
28 	munlockall();
29 }
30 
31 int main(int argc, char **argv)
32 {
33 	ksft_print_header();
34 	ksft_set_plan(1);
35 
36 	if (!getuid())
37 		ksft_test_result_skip("The test must be run from a normal user\n");
38 	else
39 		test_limit();
40 
41 	ksft_finished();
42 }
43