Home | History | Annotate | Download | only in linux
      1 #define _GNU_SOURCE
      2 #include "tests/sys_mman.h"
      3 #include <stdio.h>
      4 #include <stdlib.h>
      5 
      6 static char *mkmap(unsigned sz)
      7 {
      8 	static char *map;
      9 	static unsigned mapsz;
     10 	char *p;
     11 
     12 	if (map != NULL)
     13 		munmap(map, mapsz);
     14 
     15 	p = (char *)mmap(0, sz, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);
     16 
     17 	if (p == (char *)-1) {
     18 		perror("mmap");
     19 		exit(1);
     20 	}
     21 
     22 	map = p;
     23 	mapsz = sz;
     24 
     25 	return p;
     26 }
     27 
     28 
     29 int main()
     30 {
     31 	char *np;
     32 	char *p;
     33 
     34 	p = mkmap(1024*1024);
     35 	np = mremap(p, 1024*1024, 256*1024, 0);	/* shrink, fixed */
     36 	if (np == (char *)-1)
     37 		perror("mremap(shrink, fixed)");
     38 	if (np != p)
     39 		fprintf(stderr, "shrink, nomove: p=%p np=%p: shrink moved?!\n",
     40 			p, np);
     41 	if (np != (char *)-1)
     42 		munmap(np, 256*1024);
     43 
     44 	p = mkmap(1024*1024);
     45 	np = mremap(p, 1024*1024, 256*1024, MREMAP_MAYMOVE);	/* shrink, maymove */
     46 	if (np == (char *)-1)
     47 		perror("mremap(shrink, maymove)");
     48 	if (np != p)
     49 		fprintf(stderr, "shrink, maymove: p=%p np=%p: shrink moved?!\n",
     50 			p, np);
     51 	if (np != (char *)-1)
     52 		munmap(np, 256*1024);
     53 
     54 	p = mkmap(1024*1024);
     55 	np = mremap(p, 1024*1024, 2048*1024, 0); /* grow, fixed */
     56 	if (np == (char *)-1)
     57 		perror("mremap(grow, fixed)");
     58 	if (np != p)
     59 		fprintf(stderr, "grow, nomove: p=%p np=%p: shrink moved?!\n",
     60 			p, np);
     61 	if (np != (char *)-1)
     62 		munmap(np, 2048*1024);
     63 
     64 	p = mkmap(1024*1024);
     65 	np = mremap(p, 1024*1024, 2048*1024, MREMAP_MAYMOVE); /* grow, maymove */
     66 	if (np == (char *)-1)
     67 		perror("mremap(grow, maymove)");
     68 	if (np != p)
     69 		fprintf(stderr, "grow, maymove: p=%p np=%p: shrink moved?!\n",
     70 			p, np);
     71 	if (np != (char *)-1)
     72 		munmap(np, 2048*1024);
     73 
     74 	p = mkmap(1024*1024);
     75 	munmap(p+512*1024, 4096);
     76 	np = mremap(p, 512*1024, 1024*1024, 0); /* grow, nomove, constrained */
     77 	if (np == (char *)-1)
     78 		perror("mremap(grow, nomove, constrained)");
     79 	else if (np == p)
     80 		fprintf(stderr, "grow, maymove, constrained: p=%p np=%p (managed to grow without moving?!)\n",
     81 			p, np);
     82 	if (np != (char *)-1)
     83 		munmap(np, 1024*1024);
     84 
     85 	p = mkmap(1024*1024);
     86 	munmap(p+512*1024, 4096);
     87 
     88 	np = mremap(p, 512*1024, 1024*1024, MREMAP_MAYMOVE); /* grow, maymove, constrained */
     89 	if (np == (char *)-1)
     90 		perror("mremap(grow, maymove, constrained)");
     91 	if (np == p)
     92 		fprintf(stderr, "grow, maymove, constrained: p=%p np=%p (managed to grow without moving?!)\n",
     93 			p, np);
     94 	if (np != (char *)-1)
     95 		munmap(np, 1024*1024);
     96 
     97 	return 0;
     98 }
     99