]>
Commit | Line | Data |
---|---|---|
7e50533d JE |
1 | #define _GNU_SOURCE |
2 | #include <assert.h> | |
3 | #include <fcntl.h> | |
4 | #include <stdio.h> | |
5 | #include <stdlib.h> | |
6 | #include <string.h> | |
7 | #include <sys/mman.h> | |
8 | #include <sys/stat.h> | |
9 | #include <sys/types.h> | |
10 | #include <unistd.h> | |
11 | ||
12 | typedef unsigned long long u64; | |
13 | ||
14 | static size_t length = 1 << 24; | |
15 | ||
16 | static u64 read_rss(void) | |
17 | { | |
18 | char buf[4096], *s = buf; | |
19 | int i, fd; | |
20 | u64 rss; | |
21 | ||
22 | fd = open("/proc/self/statm", O_RDONLY); | |
23 | assert(fd > 2); | |
24 | memset(buf, 0, sizeof(buf)); | |
25 | read(fd, buf, sizeof(buf) - 1); | |
26 | for (i = 0; i < 1; i++) | |
27 | s = strchr(s, ' ') + 1; | |
28 | rss = strtoull(s, NULL, 10); | |
29 | return rss << 12; /* assumes 4k pagesize */ | |
30 | } | |
31 | ||
32 | static void do_mmap(int fd, int extra_flags, int unmap) | |
33 | { | |
34 | int *p; | |
35 | int flags = MAP_PRIVATE | MAP_POPULATE | extra_flags; | |
36 | u64 before, after; | |
37 | ||
38 | before = read_rss(); | |
39 | p = mmap(NULL, length, PROT_READ | PROT_WRITE, flags, fd, 0); | |
40 | assert(p != MAP_FAILED || | |
41 | !"mmap returned an unexpected error"); | |
42 | after = read_rss(); | |
43 | assert(llabs(after - before - length) < 0x40000 || | |
44 | !"rss didn't grow as expected"); | |
45 | if (!unmap) | |
46 | return; | |
47 | munmap(p, length); | |
48 | after = read_rss(); | |
49 | assert(llabs(after - before) < 0x40000 || | |
50 | !"rss didn't shrink as expected"); | |
51 | } | |
52 | ||
53 | static int open_file(const char *path) | |
54 | { | |
55 | int fd, err; | |
56 | ||
57 | unlink(path); | |
58 | fd = open(path, O_CREAT | O_RDWR | O_TRUNC | O_EXCL | |
59 | | O_LARGEFILE | O_CLOEXEC, 0600); | |
60 | assert(fd > 2); | |
61 | unlink(path); | |
62 | err = ftruncate(fd, length); | |
63 | assert(!err); | |
64 | return fd; | |
65 | } | |
66 | ||
67 | int main(void) | |
68 | { | |
69 | int hugefd, fd; | |
70 | ||
71 | fd = open_file("/dev/shm/hugetlbhog"); | |
72 | hugefd = open_file("/hugepages/hugetlbhog"); | |
73 | ||
74 | system("echo 100 > /proc/sys/vm/nr_hugepages"); | |
75 | do_mmap(-1, MAP_ANONYMOUS, 1); | |
76 | do_mmap(fd, 0, 1); | |
77 | do_mmap(-1, MAP_ANONYMOUS | MAP_HUGETLB, 1); | |
78 | do_mmap(hugefd, 0, 1); | |
79 | do_mmap(hugefd, MAP_HUGETLB, 1); | |
80 | /* Leak the last one to test do_exit() */ | |
81 | do_mmap(-1, MAP_ANONYMOUS | MAP_HUGETLB, 0); | |
82 | printf("oll korrekt.\n"); | |
83 | return 0; | |
84 | } |