blob: 012a83e6dddf64a57aa1b5628ddde28b6ed937a1 [file] [log] [blame] [edit]
#include <stdio.h>
#include <stdlib.h>
#include <sys/mman.h>
#include <unistd.h>
#include <fcntl.h>
/* This program allocates memory with multiple calls to remap. This
* can be used to verify if the remap api is working correctly. */
#define PAGE_SHIFT 12
#define ROUND_PAGES(memsize) ((memsize >> (PAGE_SHIFT)) << PAGE_SHIFT)
int main(int argc, char *argv[]) {
unsigned int memsize;
char *mem;
int i, numpages, fd;
if (argc != 2) {
printf("Usage: %s <memory_size>\n", argv[0]);
exit(EXIT_FAILURE);
}
memsize = strtoul(argv[1], NULL, 10);
memsize = ROUND_PAGES(memsize);
/* We should be limited to < 4G so any size other than 0 is ok */
if (memsize == 0) {
printf("Invalid memsize\n");
exit(EXIT_FAILURE);
}
numpages = memsize >> PAGE_SHIFT;
mem = mmap(0, memsize, PROT_READ | PROT_WRITE,
MAP_PRIVATE | MAP_ANONYMOUS,
-1, 0);
if (mem == (void*) -1) {
perror("Failed to allocate anon private memory using mmap\n");
exit(EXIT_FAILURE);
}
for (i = 2; i <= 16; i <<= 1) {
mem = mremap(mem , memsize * (i >> 1),
memsize * i,
1 /* MREMAP_MAYMOVE */);
if (mem == MAP_FAILED) {
perror("Failed to remap expand anon private memory\n");
exit(EXIT_FAILURE);
}
printf("Successfully remapped %d bytes @%p\n",
memsize * i, mem);
}
if (munmap(mem, memsize * 16)) {
perror("Could not unmap and free memory\n");
exit(EXIT_FAILURE);
}
mem = mmap(0, memsize, PROT_READ | PROT_WRITE,
MAP_PRIVATE | MAP_ANONYMOUS,
-1, 0);
if (mem == (void*) -1) {
perror("Failed to allocate anon private memory using mmap\n");
exit(EXIT_FAILURE);
}
exit(EXIT_SUCCESS);
}