Commit | Line | Data |
---|---|---|
0c63e8b7 ME |
1 | /* |
2 | * Copyright 2016, Anton Blanchard, Michael Ellerman, IBM Corp. | |
3 | * Licensed under GPLv2. | |
4 | */ | |
5 | ||
6 | #include <stdio.h> | |
7 | #include <stdlib.h> | |
8 | #include <sys/mman.h> | |
9 | #include <time.h> | |
be68fb64 | 10 | #include <getopt.h> |
0c63e8b7 ME |
11 | |
12 | #include "utils.h" | |
13 | ||
14 | #define ITERATIONS 5000000 | |
15 | ||
be68fb64 AK |
16 | #define MEMSIZE (1UL << 27) |
17 | #define PAGE_SIZE (1UL << 16) | |
18 | #define CHUNK_COUNT (MEMSIZE/PAGE_SIZE) | |
19 | ||
20 | static int pg_fault; | |
21 | static int iterations = ITERATIONS; | |
22 | ||
23 | static struct option options[] = { | |
24 | { "pgfault", no_argument, &pg_fault, 1 }, | |
25 | { "iterations", required_argument, 0, 'i' }, | |
26 | { 0, }, | |
27 | }; | |
28 | ||
29 | static void usage(void) | |
30 | { | |
31 | printf("mmap_bench <--pgfault> <--iterations count>\n"); | |
32 | } | |
0c63e8b7 ME |
33 | |
34 | int test_mmap(void) | |
35 | { | |
36 | struct timespec ts_start, ts_end; | |
be68fb64 | 37 | unsigned long i = iterations; |
0c63e8b7 ME |
38 | |
39 | clock_gettime(CLOCK_MONOTONIC, &ts_start); | |
40 | ||
41 | while (i--) { | |
42 | char *c = mmap(NULL, MEMSIZE, PROT_READ|PROT_WRITE, | |
43 | MAP_PRIVATE|MAP_ANONYMOUS, -1, 0); | |
44 | FAIL_IF(c == MAP_FAILED); | |
be68fb64 AK |
45 | if (pg_fault) { |
46 | int count; | |
47 | for (count = 0; count < CHUNK_COUNT; count++) | |
48 | c[count << 16] = 'c'; | |
49 | } | |
0c63e8b7 ME |
50 | munmap(c, MEMSIZE); |
51 | } | |
52 | ||
53 | clock_gettime(CLOCK_MONOTONIC, &ts_end); | |
54 | ||
55 | printf("time = %.6f\n", ts_end.tv_sec - ts_start.tv_sec + (ts_end.tv_nsec - ts_start.tv_nsec) / 1e9); | |
56 | ||
57 | return 0; | |
58 | } | |
59 | ||
be68fb64 | 60 | int main(int argc, char *argv[]) |
0c63e8b7 | 61 | { |
be68fb64 AK |
62 | signed char c; |
63 | while (1) { | |
64 | int option_index = 0; | |
65 | ||
66 | c = getopt_long(argc, argv, "", options, &option_index); | |
67 | ||
68 | if (c == -1) | |
69 | break; | |
70 | ||
71 | switch (c) { | |
72 | case 0: | |
73 | if (options[option_index].flag != 0) | |
74 | break; | |
75 | ||
76 | usage(); | |
77 | exit(1); | |
78 | break; | |
79 | case 'i': | |
80 | iterations = atoi(optarg); | |
81 | break; | |
82 | default: | |
83 | usage(); | |
84 | exit(1); | |
85 | } | |
86 | } | |
0c63e8b7 ME |
87 | return test_harness(test_mmap, "mmap_bench"); |
88 | } |