@@ -22,7 +22,6 @@ use vm_memory::{Error as VmMemoryError, GuestMemoryError, WriteVolatile};
2222use vmm_sys_util:: errno;
2323
2424use crate :: DirtyBitmap ;
25- use crate :: arch:: arch_memory_regions;
2625use crate :: utils:: { KIB_TO_BYTES_SHIFT , get_page_size, u64_to_usize} ;
2726use crate :: vmm_config:: machine_config:: HugePageConfig ;
2827
@@ -67,15 +66,15 @@ where
6766
6867 /// Creates a GuestMemoryMmap with `size` in MiB backed by a memfd.
6968 fn memfd_backed (
70- mem_size_mib : usize ,
69+ regions : & [ ( GuestAddress , usize ) ] ,
7170 track_dirty_pages : bool ,
7271 huge_pages : HugePageConfig ,
7372 ) -> Result < Self , MemoryError > {
74- let memfd_file = create_memfd ( mem_size_mib , huge_pages . into ( ) ) ? . into_file ( ) ;
75- let regions = arch_memory_regions ( mem_size_mib << KIB_TO_BYTES_SHIFT ) . into_iter ( ) ;
73+ let size = regions . iter ( ) . map ( | ( _ , size ) | size ) . sum ( ) ;
74+ let memfd_file = create_memfd ( size , huge_pages . into ( ) ) ? . into_file ( ) ;
7675
7776 Self :: create (
78- regions,
77+ regions. iter ( ) . copied ( ) ,
7978 libc:: MAP_SHARED | huge_pages. mmap_flags ( ) ,
8079 Some ( memfd_file) ,
8180 track_dirty_pages,
@@ -100,15 +99,10 @@ where
10099 /// and a `state` containing mapping information.
101100 fn snapshot_file (
102101 file : File ,
103- state : & GuestMemoryState ,
102+ regions : impl Iterator < Item = ( GuestAddress , usize ) > ,
104103 track_dirty_pages : bool ,
105104 ) -> Result < Self , MemoryError > {
106- Self :: create (
107- state. regions ( ) ,
108- libc:: MAP_PRIVATE ,
109- Some ( file) ,
110- track_dirty_pages,
111- )
105+ Self :: create ( regions, libc:: MAP_PRIVATE , Some ( file) , track_dirty_pages)
112106 }
113107
114108 /// Describes GuestMemoryMmap through a GuestMemoryState struct.
@@ -327,10 +321,9 @@ impl GuestMemoryExtension for GuestMemoryMmap {
327321}
328322
329323fn create_memfd (
330- size : usize ,
324+ mem_size : usize ,
331325 hugetlb_size : Option < memfd:: HugetlbSize > ,
332326) -> Result < memfd:: Memfd , MemoryError > {
333- let mem_size = size << KIB_TO_BYTES_SHIFT ;
334327 // Create a memfd.
335328 let opts = memfd:: MemfdOptions :: default ( )
336329 . hugetlb ( hugetlb_size)
@@ -570,7 +563,7 @@ mod tests {
570563 guest_memory. dump ( & mut memory_file) . unwrap ( ) ;
571564
572565 let restored_guest_memory =
573- GuestMemoryMmap :: snapshot_file ( memory_file, & memory_state, false ) . unwrap ( ) ;
566+ GuestMemoryMmap :: snapshot_file ( memory_file, memory_state. regions ( ) , false ) . unwrap ( ) ;
574567
575568 // Check that the region contents are the same.
576569 let mut restored_region = vec ! [ 0u8 ; page_size * 2 ] ;
@@ -629,7 +622,7 @@ mod tests {
629622
630623 // We can restore from this because this is the first dirty dump.
631624 let restored_guest_memory =
632- GuestMemoryMmap :: snapshot_file ( file, & memory_state, false ) . unwrap ( ) ;
625+ GuestMemoryMmap :: snapshot_file ( file, memory_state. regions ( ) , false ) . unwrap ( ) ;
633626
634627 // Check that the region contents are the same.
635628 let mut restored_region = vec ! [ 0u8 ; region_size] ;
0 commit comments