@@ -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