@@ -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 ;
@@ -146,14 +146,16 @@ impl KvmRegion {
146146 pub ( crate ) fn from_mmap_region (
147147 region : GuestRegionMmap ,
148148 slot : u32 ,
149- guest_memfd : Option < & FileOffset > ,
149+ guest_memfd : Option < FileOffset > ,
150150 ) -> Self {
151151 let region = ManuallyDrop :: new ( region) ;
152- let flags = if region. bitmap ( ) . is_some ( ) {
153- KVM_MEM_LOG_DIRTY_PAGES
154- } else {
155- 0
156- } ;
152+ let mut flags = 0 ;
153+ if region. bitmap ( ) . is_some ( ) {
154+ flags |= KVM_MEM_LOG_DIRTY_PAGES ;
155+ }
156+ if guest_memfd. is_some ( ) {
157+ flags |= KVM_MEM_GUEST_MEMFD ;
158+ }
157159
158160 #[ allow( clippy:: cast_sign_loss) ]
159161 let ( guest_memfd, guest_memfd_offset) = guest_memfd
@@ -309,18 +311,16 @@ pub fn create(
309311}
310312
311313/// Creates a GuestMemoryMmap with `size` in MiB backed by a memfd.
312- pub fn memfd_backed (
313- regions : & [ ( GuestAddress , usize ) ] ,
314+ pub fn file_shared (
315+ file : File ,
316+ regions : impl Iterator < Item = ( GuestAddress , usize ) > ,
314317 track_dirty_pages : bool ,
315318 huge_pages : HugePageConfig ,
316319) -> Result < Vec < GuestRegionMmap > , MemoryError > {
317- let size = regions. iter ( ) . map ( |& ( _, size) | size as u64 ) . sum ( ) ;
318- let memfd_file = create_memfd ( size, huge_pages. into ( ) ) ?. into_file ( ) ;
319-
320320 create (
321- regions. iter ( ) . copied ( ) ,
321+ regions,
322322 libc:: MAP_SHARED | huge_pages. mmap_flags ( ) ,
323- Some ( memfd_file ) ,
323+ Some ( file ) ,
324324 track_dirty_pages,
325325 0 ,
326326 )
@@ -343,7 +343,7 @@ pub fn anonymous(
343343
344344/// Creates a GuestMemoryMmap given a `file` containing the data
345345/// and a `state` containing mapping information.
346- pub fn snapshot_file (
346+ pub fn file_private (
347347 file : File ,
348348 regions : impl Iterator < Item = ( GuestAddress , usize ) > ,
349349 track_dirty_pages : bool ,
@@ -536,7 +536,8 @@ impl GuestMemoryExtension for GuestMemoryMmap {
536536 }
537537}
538538
539- fn create_memfd (
539+ /// Creates a memfd of the given size and huge pages configuration
540+ pub fn create_memfd (
540541 mem_size : u64 ,
541542 hugetlb_size : Option < memfd:: HugetlbSize > ,
542543) -> Result < memfd:: Memfd , MemoryError > {
@@ -790,7 +791,7 @@ mod tests {
790791 guest_memory. dump ( & mut memory_file) . unwrap ( ) ;
791792
792793 let restored_guest_memory =
793- kvmify ( snapshot_file ( memory_file, memory_state. regions ( ) , false , 0 ) . unwrap ( ) ) ;
794+ kvmify ( file_private ( memory_file, memory_state. regions ( ) , false , 0 ) . unwrap ( ) ) ;
794795
795796 // Check that the region contents are the same.
796797 let mut restored_region = vec ! [ 0u8 ; page_size * 2 ] ;
@@ -848,7 +849,7 @@ mod tests {
848849
849850 // We can restore from this because this is the first dirty dump.
850851 let restored_guest_memory =
851- kvmify ( snapshot_file ( file, memory_state. regions ( ) , false , 0 ) . unwrap ( ) ) ;
852+ kvmify ( file_private ( file, memory_state. regions ( ) , false , 0 ) . unwrap ( ) ) ;
852853
853854 // Check that the region contents are the same.
854855 let mut restored_region = vec ! [ 0u8 ; region_size] ;
0 commit comments