Files
mckernel/test/issues/1183/hugemap.c
Ken Sato 8efced7bf7 mmap: Check if size exceeds available memory when MAP_HUGETLB
If size exceeds, mmap fails and set -ENOMEM

Change-Id: I4f0d6e18ee3a7c8e32e251b7ed07ee9f76305603
Refs: #1183
2019-08-08 00:31:36 +00:00

74 lines
1.2 KiB
C

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/mman.h>
#define MAP_HUGE_SHIFT 26
void print_usage(void)
{
printf("usage: hugemap <total_mapsize(GB)> <mapsize(GB)> <pgshift>\n");
}
int mmap_flag(size_t mapsize, int page_shift)
{
char *addr_mmap;
int flags = MAP_ANONYMOUS | MAP_PRIVATE;
if (page_shift >= 0) {
/* mean use MAP_HUGETLB */
flags |= MAP_HUGETLB | (page_shift << MAP_HUGE_SHIFT);
}
addr_mmap = mmap(0, mapsize,
PROT_READ | PROT_WRITE,
flags, -1, 0);
if (addr_mmap == MAP_FAILED) {
return 1;
}
return 0;
}
int main(int argc, char **argv)
{
int ret;
int i;
unsigned long maptotal;
size_t mapsize;
int pgshift;
void *addr = NULL;
if (argc < 4) {
print_usage();
return 1;
}
maptotal = atol(argv[1]) << 30;
mapsize = atol(argv[2]) << 30;
pgshift = atoi(argv[3]);
printf("*** total_mapsize: %ld GB, mapsize: %ld pgshift: %d\n",
maptotal >> 30, mapsize >> 30, pgshift);
for (i = 0; i < maptotal / mapsize; i++) {
printf("** mmap %ld GB: ", mapsize >> 30);
ret = mmap_flag(mapsize, pgshift);
if (ret != 0) {
printf("failed\n");
goto out;
}
else {
printf("succeed\n");
}
}
printf("** all mmaps succeeded\n");
out:
return ret;
}