Home | History | Annotate | Download | only in memory_api
      1 #include <stdio.h>
      2 #include <stdlib.h>
      3 #include <sys/mman.h>
      4 #include <unistd.h>
      5 #include <fcntl.h>
      6 
      7 /* This program allocates memory with multiple calls to remap. This
      8  * can be used to verify if the remap api is working correctly. */
      9 
     10 #define PAGE_SHIFT 12
     11 
     12 #define ROUND_PAGES(memsize) ((memsize >> (PAGE_SHIFT)) << PAGE_SHIFT)
     13 
     14 int main(int argc, char *argv[]) {
     15 	unsigned int memsize;
     16 	char *mem;
     17 	int i, numpages, fd;
     18 
     19 	if (argc != 2) {
     20 		printf("Usage: %s <memory_size>\n", argv[0]);
     21 		exit(EXIT_FAILURE);
     22 	}
     23 
     24 	memsize = strtoul(argv[1], NULL, 10);
     25 
     26 	memsize = ROUND_PAGES(memsize);
     27 
     28 	/* We should be limited to < 4G so any size other than 0 is ok */
     29 	if (memsize == 0) {
     30 		printf("Invalid memsize\n");
     31 		exit(EXIT_FAILURE);
     32 	}
     33 
     34 	numpages = memsize >> PAGE_SHIFT;
     35 
     36 	mem =  mmap(0, memsize, PROT_READ | PROT_WRITE,
     37 			MAP_PRIVATE | MAP_ANONYMOUS,
     38 			-1, 0);
     39 
     40 	if (mem == (void*) -1) {
     41 		perror("Failed to allocate anon private memory using mmap\n");
     42 		exit(EXIT_FAILURE);
     43 	}
     44 
     45 	for (i = 2; i <= 16; i <<= 1) {
     46 		mem = mremap(mem , memsize * (i >> 1),
     47 					memsize * i,
     48 					1 /* MREMAP_MAYMOVE */);
     49 
     50 		if (mem == MAP_FAILED) {
     51 			perror("Failed to remap expand anon private memory\n");
     52 			exit(EXIT_FAILURE);
     53 		}
     54 
     55 		printf("Successfully remapped %d bytes @%p\n",
     56 				memsize * i, mem);
     57 	}
     58 
     59 	if (munmap(mem, memsize * 16)) {
     60 		perror("Could not unmap and free memory\n");
     61 		exit(EXIT_FAILURE);
     62 	}
     63 
     64 	mem =  mmap(0, memsize, PROT_READ | PROT_WRITE,
     65 			MAP_PRIVATE | MAP_ANONYMOUS,
     66 			-1, 0);
     67 
     68 	if (mem == (void*) -1) {
     69 		perror("Failed to allocate anon private memory using mmap\n");
     70 		exit(EXIT_FAILURE);
     71 	}
     72 
     73 	exit(EXIT_SUCCESS);
     74 }
     75