@@ -57,7 +57,7 @@ use crate::vmm_config::instance_info::InstanceInfo;
5757use crate :: vmm_config:: machine_config:: MachineConfigError ;
5858use crate :: vmm_config:: snapshot:: { LoadSnapshotParams , MemBackendType } ;
5959use crate :: vstate:: kvm:: { Kvm , KvmError } ;
60- use crate :: vstate:: memory:: { MaybeBounce , create_memfd} ;
60+ use crate :: vstate:: memory:: { MaybeBounce , create_memfd, MemoryError } ;
6161#[ cfg( target_arch = "aarch64" ) ]
6262use crate :: vstate:: resources:: ResourceAllocator ;
6363use crate :: vstate:: vcpu:: VcpuError ;
@@ -469,10 +469,10 @@ pub enum BuildMicrovmFromSnapshotError {
469469 /// Failed to load guest memory: {0}
470470 GuestMemory ( #[ from] BuildMicrovmFromSnapshotErrorGuestMemoryError ) ,
471471 /// Userfault bitmap memfd error: {0}
472- UserfaultBitmapMemfd ( #[ from] crate :: vstate :: memory :: MemoryError ) ,
472+ UserfaultBitmapMemfd ( #[ from] MemoryError ) ,
473473}
474474
475- fn memfd_to_slice ( memfd : & Option < File > ) -> Option < & mut [ u8 ] > {
475+ fn memfd_to_slice ( memfd : & Option < File > ) -> Result < Option < & mut [ u8 ] > , MemoryError > {
476476 if let Some ( bitmap_file) = memfd {
477477 let len = u64_to_usize (
478478 bitmap_file
@@ -494,16 +494,15 @@ fn memfd_to_slice(memfd: &Option<File>) -> Option<&mut [u8]> {
494494 } ;
495495
496496 if bitmap_addr == libc:: MAP_FAILED {
497- panic ! (
498- "Failed to mmap userfault bitmap file: {}" ,
499- std:: io:: Error :: last_os_error( )
500- ) ;
497+ return Err ( MemoryError :: Mmap ( std:: io:: Error :: last_os_error ( ) ) ) ;
501498 }
502499
503500 // SAFETY: `bitmap_addr` is a valid memory address returned by `mmap`.
504- Some ( unsafe { std:: slice:: from_raw_parts_mut ( bitmap_addr. cast ( ) , len) } )
501+ Ok ( Some ( unsafe {
502+ std:: slice:: from_raw_parts_mut ( bitmap_addr. cast ( ) , len)
503+ } ) )
505504 } else {
506- None
505+ Ok ( None )
507506 }
508507}
509508// TODO: take it from kvm-bindings when userfault support is merged upstream
@@ -601,7 +600,7 @@ pub fn build_microvm_from_snapshot(
601600 }
602601 } ;
603602
604- let mut userfault_bitmap = memfd_to_slice ( & userfault_bitmap_memfd) ;
603+ let mut userfault_bitmap = memfd_to_slice ( & userfault_bitmap_memfd) ? ;
605604 if let Some ( ref mut slice) = userfault_bitmap {
606605 // Set all bits so a fault on any page will cause a VM exit
607606 slice. fill ( 0xffu8 ) ;
0 commit comments