@@ -12,7 +12,7 @@ use std::os::fd::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 ;
@@ -138,14 +138,16 @@ impl KvmRegion {
138138 pub ( crate ) fn from_mmap_region (
139139 region : GuestRegionMmap ,
140140 slot : u32 ,
141- guest_memfd : Option < & FileOffset > ,
141+ guest_memfd : Option < FileOffset > ,
142142 ) -> Self {
143143 let region = ManuallyDrop :: new ( region) ;
144- let flags = if region. bitmap ( ) . is_some ( ) {
145- KVM_MEM_LOG_DIRTY_PAGES
146- } else {
147- 0
148- } ;
144+ let mut flags = 0 ;
145+ if region. bitmap ( ) . is_some ( ) {
146+ flags |= KVM_MEM_LOG_DIRTY_PAGES ;
147+ }
148+ if guest_memfd. is_some ( ) {
149+ flags |= KVM_MEM_GUEST_MEMFD ;
150+ }
149151
150152 #[ allow( clippy:: cast_sign_loss) ]
151153 let ( guest_memfd, guest_memfd_offset) = guest_memfd
@@ -301,18 +303,16 @@ pub fn create(
301303}
302304
303305/// Creates a GuestMemoryMmap with `size` in MiB backed by a memfd.
304- pub fn memfd_backed (
305- regions : & [ ( GuestAddress , usize ) ] ,
306+ pub fn file_shared (
307+ file : File ,
308+ regions : impl Iterator < Item = ( GuestAddress , usize ) > ,
306309 track_dirty_pages : bool ,
307310 huge_pages : HugePageConfig ,
308311) -> Result < Vec < GuestRegionMmap > , MemoryError > {
309- let size = regions. iter ( ) . map ( |& ( _, size) | size as u64 ) . sum ( ) ;
310- let memfd_file = create_memfd ( size, huge_pages. into ( ) ) ?. into_file ( ) ;
311-
312312 create (
313- regions. iter ( ) . copied ( ) ,
313+ regions,
314314 libc:: MAP_SHARED | huge_pages. mmap_flags ( ) ,
315- Some ( memfd_file ) ,
315+ Some ( file ) ,
316316 track_dirty_pages,
317317 0 ,
318318 )
@@ -335,7 +335,7 @@ pub fn anonymous(
335335
336336/// Creates a GuestMemoryMmap given a `file` containing the data
337337/// and a `state` containing mapping information.
338- pub fn snapshot_file (
338+ pub fn file_private (
339339 file : File ,
340340 regions : impl Iterator < Item = ( GuestAddress , usize ) > ,
341341 track_dirty_pages : bool ,
@@ -528,7 +528,8 @@ impl GuestMemoryExtension for GuestMemoryMmap {
528528 }
529529}
530530
531- fn create_memfd (
531+ /// Creates a memfd of the given size and huge pages configuration
532+ pub fn create_memfd (
532533 mem_size : u64 ,
533534 hugetlb_size : Option < memfd:: HugetlbSize > ,
534535) -> Result < memfd:: Memfd , MemoryError > {
@@ -781,7 +782,7 @@ mod tests {
781782 guest_memory. dump ( & mut memory_file) . unwrap ( ) ;
782783
783784 let restored_guest_memory =
784- kvmify ( snapshot_file ( memory_file, memory_state. regions ( ) , false , 0 ) . unwrap ( ) ) ;
785+ kvmify ( file_private ( memory_file, memory_state. regions ( ) , false , 0 ) . unwrap ( ) ) ;
785786
786787 // Check that the region contents are the same.
787788 let mut restored_region = vec ! [ 0u8 ; page_size * 2 ] ;
@@ -839,7 +840,7 @@ mod tests {
839840
840841 // We can restore from this because this is the first dirty dump.
841842 let restored_guest_memory =
842- kvmify ( snapshot_file ( file, memory_state. regions ( ) , false , 0 ) . unwrap ( ) ) ;
843+ kvmify ( file_private ( file, memory_state. regions ( ) , false , 0 ) . unwrap ( ) ) ;
843844
844845 // Check that the region contents are the same.
845846 let mut restored_region = vec ! [ 0u8 ; region_size] ;
0 commit comments