26
26
#define PAGEMAP_PFN (ent ) ((ent) & ((1ull << 55) - 1))
27
27
28
28
int pagemap_fd ;
29
+ int backing_fd = -1 ;
30
+ int mmap_flags = MAP_ANONYMOUS | MAP_NORESERVE | MAP_PRIVATE ;
31
+ #define PROT_RW (PROT_READ | PROT_WRITE)
29
32
30
33
int64_t allocate_transhuge (void * ptr )
31
34
{
32
35
uint64_t ent [2 ];
33
36
34
37
/* drop pmd */
35
- if (mmap (ptr , HPAGE_SIZE , PROT_READ | PROT_WRITE ,
36
- MAP_FIXED | MAP_ANONYMOUS |
37
- MAP_NORESERVE | MAP_PRIVATE , -1 , 0 ) != ptr )
38
+ if (mmap (ptr , HPAGE_SIZE , PROT_RW , MAP_FIXED | mmap_flags ,
39
+ backing_fd , 0 ) != ptr )
38
40
errx (2 , "mmap transhuge" );
39
41
40
42
if (madvise (ptr , HPAGE_SIZE , MADV_HUGEPAGE ))
@@ -60,6 +62,8 @@ int main(int argc, char **argv)
60
62
size_t ram , len ;
61
63
void * ptr , * p ;
62
64
struct timespec a , b ;
65
+ int i = 0 ;
66
+ char * name = NULL ;
63
67
double s ;
64
68
uint8_t * map ;
65
69
size_t map_len ;
@@ -69,13 +73,23 @@ int main(int argc, char **argv)
69
73
ram = SIZE_MAX / 4 ;
70
74
else
71
75
ram *= sysconf (_SC_PAGESIZE );
76
+ len = ram ;
77
+
78
+ while (++ i < argc ) {
79
+ if (!strcmp (argv [i ], "-h" ))
80
+ errx (1 , "usage: %s [size in MiB]" , argv [0 ]);
81
+ else if (!strcmp (argv [i ], "-f" ))
82
+ name = argv [++ i ];
83
+ else
84
+ len = atoll (argv [i ]) << 20 ;
85
+ }
72
86
73
- if (argc == 1 )
74
- len = ram ;
75
- else if (! strcmp ( argv [ 1 ], "-h" ) )
76
- errx (1 , "usage: %s [size in MiB] " , argv [ 0 ] );
77
- else
78
- len = atoll ( argv [ 1 ]) << 20 ;
87
+ if (name ) {
88
+ backing_fd = open ( name , O_RDWR ) ;
89
+ if (backing_fd == -1 )
90
+ errx (2 , "open %s" , name );
91
+ mmap_flags = MAP_SHARED ;
92
+ }
79
93
80
94
warnx ("allocate %zd transhuge pages, using %zd MiB virtual memory"
81
95
" and %zd MiB of ram" , len >> HPAGE_SHIFT , len >> 20 ,
@@ -86,8 +100,7 @@ int main(int argc, char **argv)
86
100
err (2 , "open pagemap" );
87
101
88
102
len -= len % HPAGE_SIZE ;
89
- ptr = mmap (NULL , len + HPAGE_SIZE , PROT_READ | PROT_WRITE ,
90
- MAP_ANONYMOUS | MAP_NORESERVE | MAP_PRIVATE , -1 , 0 );
103
+ ptr = mmap (NULL , len + HPAGE_SIZE , PROT_RW , mmap_flags , backing_fd , 0 );
91
104
if (ptr == MAP_FAILED )
92
105
err (2 , "initial mmap" );
93
106
ptr += HPAGE_SIZE - (uintptr_t )ptr % HPAGE_SIZE ;
0 commit comments