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