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