162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0
262306a36Sopenharmony_ci#include <sys/mman.h>
362306a36Sopenharmony_ci#include <stdio.h>
462306a36Sopenharmony_ci#include <unistd.h>
562306a36Sopenharmony_ci#include <string.h>
662306a36Sopenharmony_ci#include <sys/time.h>
762306a36Sopenharmony_ci#include <sys/resource.h>
862306a36Sopenharmony_ci
962306a36Sopenharmony_cistatic int test_limit(void)
1062306a36Sopenharmony_ci{
1162306a36Sopenharmony_ci	int ret = 1;
1262306a36Sopenharmony_ci	struct rlimit lims;
1362306a36Sopenharmony_ci	void *map;
1462306a36Sopenharmony_ci
1562306a36Sopenharmony_ci	if (getrlimit(RLIMIT_MEMLOCK, &lims)) {
1662306a36Sopenharmony_ci		perror("getrlimit");
1762306a36Sopenharmony_ci		return ret;
1862306a36Sopenharmony_ci	}
1962306a36Sopenharmony_ci
2062306a36Sopenharmony_ci	if (mlockall(MCL_ONFAULT | MCL_FUTURE)) {
2162306a36Sopenharmony_ci		perror("mlockall");
2262306a36Sopenharmony_ci		return ret;
2362306a36Sopenharmony_ci	}
2462306a36Sopenharmony_ci
2562306a36Sopenharmony_ci	map = mmap(NULL, 2 * lims.rlim_max, PROT_READ | PROT_WRITE,
2662306a36Sopenharmony_ci		   MAP_PRIVATE | MAP_ANONYMOUS | MAP_POPULATE, -1, 0);
2762306a36Sopenharmony_ci	if (map != MAP_FAILED)
2862306a36Sopenharmony_ci		printf("mmap should have failed, but didn't\n");
2962306a36Sopenharmony_ci	else {
3062306a36Sopenharmony_ci		ret = 0;
3162306a36Sopenharmony_ci		munmap(map, 2 * lims.rlim_max);
3262306a36Sopenharmony_ci	}
3362306a36Sopenharmony_ci
3462306a36Sopenharmony_ci	munlockall();
3562306a36Sopenharmony_ci	return ret;
3662306a36Sopenharmony_ci}
3762306a36Sopenharmony_ci
3862306a36Sopenharmony_ciint main(int argc, char **argv)
3962306a36Sopenharmony_ci{
4062306a36Sopenharmony_ci	int ret = 0;
4162306a36Sopenharmony_ci
4262306a36Sopenharmony_ci	ret += test_limit();
4362306a36Sopenharmony_ci	return ret;
4462306a36Sopenharmony_ci}
45