@@ -57,7 +57,7 @@ use crate::vmm_config::instance_info::InstanceInfo;
57
57
use crate :: vmm_config:: machine_config:: MachineConfigError ;
58
58
use crate :: vmm_config:: snapshot:: { LoadSnapshotParams , MemBackendType } ;
59
59
use crate :: vstate:: kvm:: { Kvm , KvmError } ;
60
- use crate :: vstate:: memory:: { MaybeBounce , create_memfd} ;
60
+ use crate :: vstate:: memory:: { MaybeBounce , create_memfd, MemoryError } ;
61
61
#[ cfg( target_arch = "aarch64" ) ]
62
62
use crate :: vstate:: resources:: ResourceAllocator ;
63
63
use crate :: vstate:: vcpu:: VcpuError ;
@@ -469,10 +469,10 @@ pub enum BuildMicrovmFromSnapshotError {
469
469
/// Failed to load guest memory: {0}
470
470
GuestMemory ( #[ from] BuildMicrovmFromSnapshotErrorGuestMemoryError ) ,
471
471
/// Userfault bitmap memfd error: {0}
472
- UserfaultBitmapMemfd ( #[ from] crate :: vstate :: memory :: MemoryError ) ,
472
+ UserfaultBitmapMemfd ( #[ from] MemoryError ) ,
473
473
}
474
474
475
- fn memfd_to_slice ( memfd : & Option < File > ) -> Option < & mut [ u8 ] > {
475
+ fn memfd_to_slice ( memfd : & Option < File > ) -> Result < Option < & mut [ u8 ] > , MemoryError > {
476
476
if let Some ( bitmap_file) = memfd {
477
477
let len = u64_to_usize (
478
478
bitmap_file
@@ -494,16 +494,15 @@ fn memfd_to_slice(memfd: &Option<File>) -> Option<&mut [u8]> {
494
494
} ;
495
495
496
496
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 ( ) ) ) ;
501
498
}
502
499
503
500
// 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
+ } ) )
505
504
} else {
506
- None
505
+ Ok ( None )
507
506
}
508
507
}
509
508
// TODO: take it from kvm-bindings when userfault support is merged upstream
@@ -601,7 +600,7 @@ pub fn build_microvm_from_snapshot(
601
600
}
602
601
} ;
603
602
604
- let mut userfault_bitmap = memfd_to_slice ( & userfault_bitmap_memfd) ;
603
+ let mut userfault_bitmap = memfd_to_slice ( & userfault_bitmap_memfd) ? ;
605
604
if let Some ( ref mut slice) = userfault_bitmap {
606
605
// Set all bits so a fault on any page will cause a VM exit
607
606
slice. fill ( 0xffu8 ) ;
0 commit comments