2626#define PAGEMAP_PFN (ent ) ((ent) & ((1ull << 55) - 1))
2727
2828int 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)
2932
3033int64_t allocate_transhuge (void * ptr )
3134{
3235 uint64_t ent [2 ];
3336
3437 /* 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 )
3840 errx (2 , "mmap transhuge" );
3941
4042 if (madvise (ptr , HPAGE_SIZE , MADV_HUGEPAGE ))
@@ -60,6 +62,8 @@ int main(int argc, char **argv)
6062 size_t ram , len ;
6163 void * ptr , * p ;
6264 struct timespec a , b ;
65+ int i = 0 ;
66+ char * name = NULL ;
6367 double s ;
6468 uint8_t * map ;
6569 size_t map_len ;
@@ -69,13 +73,23 @@ int main(int argc, char **argv)
6973 ram = SIZE_MAX / 4 ;
7074 else
7175 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+ }
7286
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+ }
7993
8094 warnx ("allocate %zd transhuge pages, using %zd MiB virtual memory"
8195 " and %zd MiB of ram" , len >> HPAGE_SHIFT , len >> 20 ,
@@ -86,8 +100,7 @@ int main(int argc, char **argv)
86100 err (2 , "open pagemap" );
87101
88102 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 );
91104 if (ptr == MAP_FAILED )
92105 err (2 , "initial mmap" );
93106 ptr += HPAGE_SIZE - (uintptr_t )ptr % HPAGE_SIZE ;
0 commit comments