@@ -12,7 +12,7 @@ use std::os::fd::{AsFd, AsRawFd};
1212use  std:: ptr:: null_mut; 
1313use  std:: sync:: Arc ; 
1414
15- use  kvm_bindings:: { KVM_MEM_LOG_DIRTY_PAGES ,  kvm_userspace_memory_region2} ; 
15+ use  kvm_bindings:: { KVM_MEM_GUEST_MEMFD ,   KVM_MEM_LOG_DIRTY_PAGES ,  kvm_userspace_memory_region2} ; 
1616use  serde:: { Deserialize ,  Serialize } ; 
1717pub  use  vm_memory:: bitmap:: { AtomicBitmap ,  BS ,  Bitmap ,  BitmapSlice } ; 
1818pub  use  vm_memory:: mmap:: MmapRegionBuilder ; 
@@ -129,14 +129,16 @@ impl KvmRegion {
129129    pub ( crate )  fn  from_mmap_region ( 
130130        region :  GuestRegionMmap , 
131131        slot :  u32 , 
132-         guest_memfd :  Option < & FileOffset > , 
132+         guest_memfd :  Option < FileOffset > , 
133133    )  -> Self  { 
134134        let  region = ManuallyDrop :: new ( region) ; 
135-         let  flags = if  region. bitmap ( ) . is_some ( )  { 
136-             KVM_MEM_LOG_DIRTY_PAGES 
137-         }  else  { 
138-             0 
139-         } ; 
135+         let  mut  flags = 0 ; 
136+         if  region. bitmap ( ) . is_some ( )  { 
137+             flags |= KVM_MEM_LOG_DIRTY_PAGES ; 
138+         } 
139+         if  guest_memfd. is_some ( )  { 
140+             flags |= KVM_MEM_GUEST_MEMFD ; 
141+         } 
140142
141143        #[ allow( clippy:: cast_sign_loss) ]  
142144        let  ( guest_memfd,  guest_memfd_offset)  = guest_memfd
@@ -292,18 +294,16 @@ pub fn create(
292294} 
293295
294296/// Creates a GuestMemoryMmap with `size` in MiB backed by a memfd. 
295- pub  fn  memfd_backed ( 
296-     regions :  & [ ( GuestAddress ,  usize ) ] , 
297+ pub  fn  file_shared ( 
298+     file :  File , 
299+     regions :  impl  Iterator < Item  = ( GuestAddress ,  usize ) > , 
297300    track_dirty_pages :  bool , 
298301    huge_pages :  HugePageConfig , 
299302)  -> Result < Vec < GuestRegionMmap > ,  MemoryError >  { 
300-     let  size = regions. iter ( ) . map ( |& ( _,  size) | size as  u64 ) . sum ( ) ; 
301-     let  memfd_file = create_memfd ( size,  huge_pages. into ( ) ) ?. into_file ( ) ; 
302- 
303303    create ( 
304-         regions. iter ( ) . copied ( ) , 
304+         regions, 
305305        libc:: MAP_SHARED  | huge_pages. mmap_flags ( ) , 
306-         Some ( memfd_file ) , 
306+         Some ( file ) , 
307307        track_dirty_pages, 
308308        0 , 
309309    ) 
@@ -326,7 +326,7 @@ pub fn anonymous(
326326
327327/// Creates a GuestMemoryMmap given a `file` containing the data 
328328/// and a `state` containing mapping information. 
329- pub  fn  snapshot_file ( 
329+ pub  fn  file_private ( 
330330    file :  File , 
331331    regions :  impl  Iterator < Item  = ( GuestAddress ,  usize ) > , 
332332    track_dirty_pages :  bool , 
@@ -519,7 +519,8 @@ impl GuestMemoryExtension for GuestMemoryMmap {
519519    } 
520520} 
521521
522- fn  create_memfd ( 
522+ /// Creates a memfd of the given size and huge pages configuration 
523+ pub  fn  create_memfd ( 
523524    mem_size :  u64 , 
524525    hugetlb_size :  Option < memfd:: HugetlbSize > , 
525526)  -> Result < memfd:: Memfd ,  MemoryError >  { 
@@ -772,7 +773,7 @@ mod tests {
772773        guest_memory. dump ( & mut  memory_file) . unwrap ( ) ; 
773774
774775        let  restored_guest_memory =
775-             kvmify ( snapshot_file ( memory_file,  memory_state. regions ( ) ,  false ,  0 ) . unwrap ( ) ) ; 
776+             kvmify ( file_private ( memory_file,  memory_state. regions ( ) ,  false ,  0 ) . unwrap ( ) ) ; 
776777
777778        // Check that the region contents are the same. 
778779        let  mut  restored_region = vec ! [ 0u8 ;  page_size *  2 ] ; 
@@ -830,7 +831,7 @@ mod tests {
830831
831832        // We can restore from this because this is the first dirty dump. 
832833        let  restored_guest_memory =
833-             kvmify ( snapshot_file ( file,  memory_state. regions ( ) ,  false ,  0 ) . unwrap ( ) ) ; 
834+             kvmify ( file_private ( file,  memory_state. regions ( ) ,  false ,  0 ) . unwrap ( ) ) ; 
834835
835836        // Check that the region contents are the same. 
836837        let  mut  restored_region = vec ! [ 0u8 ;  region_size] ; 
0 commit comments