@@ -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 ;
@@ -478,10 +478,10 @@ pub enum BuildMicrovmFromSnapshotError {
478
478
/// Failed to load guest memory: {0}
479
479
GuestMemory ( #[ from] BuildMicrovmFromSnapshotErrorGuestMemoryError ) ,
480
480
/// Userfault bitmap memfd error: {0}
481
- UserfaultBitmapMemfd ( #[ from] crate :: vstate :: memory :: MemoryError ) ,
481
+ UserfaultBitmapMemfd ( #[ from] MemoryError ) ,
482
482
}
483
483
484
- fn memfd_to_slice ( memfd : & mut Option < File > ) -> Option < & mut [ u8 ] > {
484
+ fn memfd_to_slice ( memfd : & mut Option < File > ) -> Result < Option < & mut [ u8 ] > , MemoryError > {
485
485
if let Some ( bitmap_file) = memfd {
486
486
let len = u64_to_usize (
487
487
bitmap_file
@@ -503,16 +503,15 @@ fn memfd_to_slice(memfd: &mut Option<File>) -> Option<&mut [u8]> {
503
503
} ;
504
504
505
505
if bitmap_addr == libc:: MAP_FAILED {
506
- panic ! (
507
- "Failed to mmap userfault bitmap file: {}" ,
508
- std:: io:: Error :: last_os_error( )
509
- ) ;
506
+ return Err ( MemoryError :: Mmap ( std:: io:: Error :: last_os_error ( ) ) ) ;
510
507
}
511
508
512
509
// SAFETY: `bitmap_addr` is a valid memory address returned by `mmap`.
513
- Some ( unsafe { std:: slice:: from_raw_parts_mut ( bitmap_addr. cast ( ) , len) } )
510
+ Ok ( Some ( unsafe {
511
+ std:: slice:: from_raw_parts_mut ( bitmap_addr. cast ( ) , len)
512
+ } ) )
514
513
} else {
515
- None
514
+ Ok ( None )
516
515
}
517
516
}
518
517
// TODO: take it from kvm-bindings when userfault support is merged upstream
@@ -610,7 +609,7 @@ pub fn build_microvm_from_snapshot(
610
609
}
611
610
} ;
612
611
613
- let mut userfault_bitmap = memfd_to_slice ( & mut userfault_bitmap_memfd) ;
612
+ let mut userfault_bitmap = memfd_to_slice ( & mut userfault_bitmap_memfd) ? ;
614
613
if let Some ( ref mut slice) = userfault_bitmap {
615
614
// Set all bits so a fault on any page will cause a VM exit
616
615
slice. fill ( 0xffu8 ) ;
0 commit comments