@@ -403,6 +403,10 @@ impl GuestMemoryRegion for GuestRegionMmap {
403403        let  slice = self . mapping . get_slice ( offset. raw_value ( )  as  usize ,  count) ?; 
404404        Ok ( slice) 
405405    } 
406+ 
407+     fn  is_hugepages ( & self )  -> bool  { 
408+         self . mapping . hugepages ( ) 
409+     } 
406410} 
407411
408412/// [`GuestMemory`](trait.GuestMemory.html) implementation that mmaps the guest's memory 
@@ -434,6 +438,22 @@ impl GuestMemoryMmap {
434438/// Valid memory regions are specified as a sequence of (Address, Size, Option<FileOffset>) 
435439/// tuples sorted by Address. 
436440pub  fn  from_ranges_with_files < A ,  T > ( ranges :  T )  -> result:: Result < Self ,  Error > 
441+     where 
442+         A :  Borrow < ( GuestAddress ,  usize ,  Option < FileOffset > ) > , 
443+         T :  IntoIterator < Item  = A > , 
444+     { 
445+         Self :: from_ranges_with_files_and_hugepages ( ranges,  false ) 
446+     } 
447+ 
448+     /// Creates a container and allocates anonymous memory for guest memory regions. 
449+ /// And set guest memory regions hugepages. 
450+ /// 
451+ /// Valid memory regions are specified as a sequence of (Address, Size, Option<FileOffset>) 
452+ /// tuples sorted by Address. 
453+ pub  fn  from_ranges_with_files_and_hugepages < A ,  T > ( 
454+         ranges :  T , 
455+         hugepages :  bool , 
456+     )  -> result:: Result < Self ,  Error > 
437457    where 
438458        A :  Borrow < ( GuestAddress ,  usize ,  Option < FileOffset > ) > , 
439459        T :  IntoIterator < Item  = A > , 
@@ -445,13 +465,15 @@ impl GuestMemoryMmap {
445465                    let  guest_base = x. borrow ( ) . 0 ; 
446466                    let  size = x. borrow ( ) . 1 ; 
447467
448-                     if  let  Some ( ref  f_off)  = x. borrow ( ) . 2  { 
468+                     let   mut  r =  if  let  Some ( ref  f_off)  = x. borrow ( ) . 2  { 
449469                        MmapRegion :: from_file ( f_off. clone ( ) ,  size) 
450470                    }  else  { 
451471                        MmapRegion :: new ( size) 
452472                    } 
453-                     . map_err ( Error :: MmapRegion ) 
454-                     . and_then ( |r| GuestRegionMmap :: new ( r,  guest_base) ) 
473+                     . map_err ( Error :: MmapRegion ) ?; 
474+                     r. set_hugepages ( hugepages) ; 
475+ 
476+                     GuestRegionMmap :: new ( r,  guest_base) 
455477                } ) 
456478                . collect :: < result:: Result < Vec < _ > ,  Error > > ( ) ?, 
457479        ) 
@@ -989,6 +1011,63 @@ mod tests {
9891011        } 
9901012    } 
9911013
1014+     #[ test]  
1015+     fn  test_get_host_address_and_hugepages ( )  { 
1016+         let  f1 = TempFile :: new ( ) . unwrap ( ) . into_file ( ) ; 
1017+         f1. set_len ( 0x400 ) . unwrap ( ) ; 
1018+         let  f2 = TempFile :: new ( ) . unwrap ( ) . into_file ( ) ; 
1019+         f2. set_len ( 0x400 ) . unwrap ( ) ; 
1020+ 
1021+         let  start_addr1 = GuestAddress ( 0x0 ) ; 
1022+         let  start_addr2 = GuestAddress ( 0x800 ) ; 
1023+         let  guest_mem =
1024+             GuestMemoryMmap :: from_ranges ( & [ ( start_addr1,  0x400 ) ,  ( start_addr2,  0x400 ) ] ) . unwrap ( ) ; 
1025+         let  guest_mem_backed_by_file = GuestMemoryMmap :: from_ranges_with_files_and_hugepages ( 
1026+             & [ 
1027+                 ( start_addr1,  0x400 ,  Some ( FileOffset :: new ( f1,  0 ) ) ) , 
1028+                 ( start_addr2,  0x400 ,  Some ( FileOffset :: new ( f2,  0 ) ) ) , 
1029+             ] , 
1030+             true , 
1031+         ) 
1032+         . unwrap ( ) ; 
1033+ 
1034+         let  guest_mem_list = vec ! [ guest_mem] ; 
1035+         for  guest_mem in  guest_mem_list. iter ( )  { 
1036+             assert ! ( guest_mem. get_host_address( GuestAddress ( 0x600 ) ) . is_err( ) ) ; 
1037+             let  ( ptr0,  ptr0_huge)  = guest_mem
1038+                 . get_host_address_and_hugepages ( GuestAddress ( 0x800 ) ) 
1039+                 . unwrap ( ) ; 
1040+             let  ( ptr1,  ptr1_huge)  = guest_mem
1041+                 . get_host_address_and_hugepages ( GuestAddress ( 0xa00 ) ) 
1042+                 . unwrap ( ) ; 
1043+             assert_eq ! ( 
1044+                 ptr0, 
1045+                 guest_mem. find_region( GuestAddress ( 0x800 ) ) . unwrap( ) . as_ptr( ) 
1046+             ) ; 
1047+             assert_eq ! ( ptr0_huge,  false ) ; 
1048+             assert_eq ! ( ptr1_huge,  false ) ; 
1049+             assert_eq ! ( unsafe  {  ptr0. offset( 0x200 )  } ,  ptr1) ; 
1050+         } 
1051+ 
1052+         let  guest_mem_list = vec ! [ guest_mem_backed_by_file] ; 
1053+         for  guest_mem in  guest_mem_list. iter ( )  { 
1054+             assert ! ( guest_mem. get_host_address( GuestAddress ( 0x600 ) ) . is_err( ) ) ; 
1055+             let  ( ptr0,  ptr0_huge)  = guest_mem
1056+                 . get_host_address_and_hugepages ( GuestAddress ( 0x800 ) ) 
1057+                 . unwrap ( ) ; 
1058+             let  ( ptr1,  ptr1_huge)  = guest_mem
1059+                 . get_host_address_and_hugepages ( GuestAddress ( 0xa00 ) ) 
1060+                 . unwrap ( ) ; 
1061+             assert_eq ! ( 
1062+                 ptr0, 
1063+                 guest_mem. find_region( GuestAddress ( 0x800 ) ) . unwrap( ) . as_ptr( ) 
1064+             ) ; 
1065+             assert_eq ! ( ptr0_huge,  true ) ; 
1066+             assert_eq ! ( ptr1_huge,  true ) ; 
1067+             assert_eq ! ( unsafe  {  ptr0. offset( 0x200 )  } ,  ptr1) ; 
1068+         } 
1069+     } 
1070+ 
9921071    #[ test]  
9931072    fn  test_deref ( )  { 
9941073        let  f = TempFile :: new ( ) . unwrap ( ) . into_file ( ) ; 
0 commit comments