selftests/vm: add test for mlock() when areas are intersected
[cascardo/linux.git] / tools / testing / selftests / vm / mlock-intersect-test.c
1 /*
2  * It tests the duplicate mlock result:
3  * - the ulimit of lock page is 64k
4  * - allocate address area 64k starting from p
5  * - mlock   [p -- p + 30k]
6  * - Then mlock address  [ p -- p + 40k ]
7  *
8  * It should succeed since totally we locked
9  * 40k < 64k limitation.
10  *
11  * It should not be run with CAP_IPC_LOCK.
12  */
13 #include <stdlib.h>
14 #include <stdio.h>
15 #include <unistd.h>
16 #include <sys/resource.h>
17 #include <sys/capability.h>
18 #include <sys/mman.h>
19 #include "mlock2.h"
20
21 int main(int argc, char **argv)
22 {
23         struct rlimit new;
24         char *p = NULL;
25         cap_t cap = cap_init();
26         int i;
27
28         /* drop capabilities including CAP_IPC_LOCK */
29         if (cap_set_proc(cap))
30                 return -1;
31
32         /* set mlock limits to 64k */
33         new.rlim_cur = 65536;
34         new.rlim_max = 65536;
35         setrlimit(RLIMIT_MEMLOCK, &new);
36
37         /* test VM_LOCK */
38         p = malloc(1024 * 64);
39         if (mlock(p, 1024 * 30)) {
40                 printf("mlock() 30k return failure.\n");
41                 return -1;
42         }
43         for (i = 0; i < 10; i++) {
44                 if (mlock(p, 1024 * 40)) {
45                         printf("mlock() #%d 40k returns failure.\n", i);
46                         return -1;
47                 }
48         }
49         for (i = 0; i < 10; i++) {
50                 if (mlock2_(p, 1024 * 40, MLOCK_ONFAULT)) {
51                         printf("mlock2_() #%d 40k returns failure.\n", i);
52                         return -1;
53                 }
54         }
55         free(p);
56
57         /* Test VM_LOCKONFAULT */
58         p = malloc(1024 * 64);
59         if (mlock2_(p, 1024 * 30, MLOCK_ONFAULT)) {
60                 printf("mlock2_() 30k return failure.\n");
61                 return -1;
62         }
63         for (i = 0; i < 10; i++) {
64                 if (mlock2_(p, 1024 * 40, MLOCK_ONFAULT)) {
65                         printf("mlock2_() #%d 40k returns failure.\n", i);
66                         return -1;
67                 }
68         }
69         for (i = 0; i < 10; i++) {
70                 if (mlock(p, 1024 * 40)) {
71                         printf("mlock() #%d 40k returns failure.\n", i);
72                         return -1;
73                 }
74         }
75         return 0;
76 }