@@ -59,7 +59,9 @@ use crate::vmm_config::machine_config::MachineConfigError;
5959use crate :: vmm_config:: memory_hotplug:: MemoryHotplugConfig ;
6060use crate :: vmm_config:: snapshot:: { LoadSnapshotParams , MemBackendType } ;
6161use crate :: vstate:: kvm:: { Kvm , KvmError } ;
62- use crate :: vstate:: memory:: { GuestMemoryState , MaybeBounce , bitmap_size, create_memfd} ;
62+ use crate :: vstate:: memory:: {
63+ GuestMemoryState , MaybeBounce , MemoryError , bitmap_size, create_memfd,
64+ } ;
6365#[ cfg( target_arch = "aarch64" ) ]
6466use crate :: vstate:: resources:: ResourceAllocator ;
6567use crate :: vstate:: vcpu:: VcpuError ;
@@ -517,10 +519,10 @@ pub enum BuildMicrovmFromSnapshotError {
517519 /// Failed to load guest memory: {0}
518520 GuestMemory ( #[ from] BuildMicrovmFromSnapshotErrorGuestMemoryError ) ,
519521 /// Userfault bitmap memfd error: {0}
520- UserfaultBitmapMemfd ( #[ from] crate :: vstate :: memory :: MemoryError ) ,
522+ UserfaultBitmapMemfd ( #[ from] MemoryError ) ,
521523}
522524
523- fn memfd_to_slice ( memfd : & mut Option < File > ) -> Option < & mut [ u8 ] > {
525+ fn memfd_to_slice ( memfd : & mut Option < File > ) -> Result < Option < & mut [ u8 ] > , MemoryError > {
524526 if let Some ( bitmap_file) = memfd {
525527 let len = u64_to_usize (
526528 bitmap_file
@@ -542,16 +544,15 @@ fn memfd_to_slice(memfd: &mut Option<File>) -> Option<&mut [u8]> {
542544 } ;
543545
544546 if bitmap_addr == libc:: MAP_FAILED {
545- panic ! (
546- "Failed to mmap userfault bitmap file: {}" ,
547- std:: io:: Error :: last_os_error( )
548- ) ;
547+ return Err ( MemoryError :: Mmap ( std:: io:: Error :: last_os_error ( ) ) ) ;
549548 }
550549
551550 // SAFETY: `bitmap_addr` is a valid memory address returned by `mmap`.
552- Some ( unsafe { std:: slice:: from_raw_parts_mut ( bitmap_addr. cast ( ) , len) } )
551+ Ok ( Some ( unsafe {
552+ std:: slice:: from_raw_parts_mut ( bitmap_addr. cast ( ) , len)
553+ } ) )
553554 } else {
554- None
555+ Ok ( None )
555556 }
556557}
557558
@@ -656,7 +657,7 @@ pub fn build_microvm_from_snapshot(
656657 }
657658 } ;
658659
659- let mut userfault_bitmap_slice = memfd_to_slice ( & mut userfault_bitmap_memfd) ;
660+ let mut userfault_bitmap_slice = memfd_to_slice ( & mut userfault_bitmap_memfd) ? ;
660661 if let Some ( ref mut slice) = userfault_bitmap_slice {
661662 // Set all bits so a fault on any page will cause a VM exit
662663 slice. fill ( 0xffu8 ) ;
0 commit comments