/* * It tests the duplicate mlock result: * - the ulimit of lock page is 64k * - allocate address area 64k starting from p * - mlock [p -- p + 30k] * - Then mlock address [ p -- p + 40k ] * * It should succeed since totally we locked * 40k < 64k limitation. * * It should not be run with CAP_IPC_LOCK. */ #include #include #include #include #include #include #include "mlock2.h" int main(int argc, char **argv) { struct rlimit new; char *p = NULL; cap_t cap = cap_init(); int i; /* drop capabilities including CAP_IPC_LOCK */ if (cap_set_proc(cap)) return -1; /* set mlock limits to 64k */ new.rlim_cur = 65536; new.rlim_max = 65536; setrlimit(RLIMIT_MEMLOCK, &new); /* test VM_LOCK */ p = malloc(1024 * 64); if (mlock(p, 1024 * 30)) { printf("mlock() 30k return failure.\n"); return -1; } for (i = 0; i < 10; i++) { if (mlock(p, 1024 * 40)) { printf("mlock() #%d 40k returns failure.\n", i); return -1; } } for (i = 0; i < 10; i++) { if (mlock2_(p, 1024 * 40, MLOCK_ONFAULT)) { printf("mlock2_() #%d 40k returns failure.\n", i); return -1; } } free(p); /* Test VM_LOCKONFAULT */ p = malloc(1024 * 64); if (mlock2_(p, 1024 * 30, MLOCK_ONFAULT)) { printf("mlock2_() 30k return failure.\n"); return -1; } for (i = 0; i < 10; i++) { if (mlock2_(p, 1024 * 40, MLOCK_ONFAULT)) { printf("mlock2_() #%d 40k returns failure.\n", i); return -1; } } for (i = 0; i < 10; i++) { if (mlock(p, 1024 * 40)) { printf("mlock() #%d 40k returns failure.\n", i); return -1; } } return 0; }