@@ -212,6 +212,49 @@ pub enum VmmActionError {
212212 VsockConfig ( ErrorKind , VsockError ) ,
213213}
214214
215+ // It's convenient to turn StartMicrovmErrors into VmmActionErrors directly.
216+ impl std:: convert:: From < StartMicrovmError > for VmmActionError {
217+ fn from ( e : StartMicrovmError ) -> Self {
218+ let kind = match e {
219+ // User errors.
220+ #[ cfg( feature = "vsock" ) ]
221+ StartMicrovmError :: CreateVsockDevice ( _) => ErrorKind :: User ,
222+ StartMicrovmError :: CreateBlockDevice ( _)
223+ | StartMicrovmError :: CreateNetDevice ( _)
224+ | StartMicrovmError :: KernelCmdline ( _)
225+ | StartMicrovmError :: KernelLoader ( _)
226+ | StartMicrovmError :: MicroVMAlreadyRunning
227+ | StartMicrovmError :: MissingKernelConfig
228+ | StartMicrovmError :: NetDeviceNotConfigured
229+ | StartMicrovmError :: OpenBlockDevice ( _)
230+ | StartMicrovmError :: VcpusNotConfigured => ErrorKind :: User ,
231+ // Internal errors.
232+ #[ cfg( feature = "vsock" ) ]
233+ StartMicrovmError :: RegisterVsockDevice ( _) => ErrorKind :: Internal ,
234+ StartMicrovmError :: ConfigureSystem ( _)
235+ | StartMicrovmError :: ConfigureVm ( _)
236+ | StartMicrovmError :: CreateRateLimiter ( _)
237+ | StartMicrovmError :: DeviceManager
238+ | StartMicrovmError :: EventFd
239+ | StartMicrovmError :: GuestMemory ( _)
240+ | StartMicrovmError :: LegacyIOBus ( _)
241+ | StartMicrovmError :: RegisterBlockDevice ( _)
242+ | StartMicrovmError :: RegisterEvent
243+ | StartMicrovmError :: RegisterNetDevice ( _)
244+ | StartMicrovmError :: SeccompFilters ( _)
245+ | StartMicrovmError :: Vcpu ( _)
246+ | StartMicrovmError :: VcpuConfigure ( _)
247+ | StartMicrovmError :: VcpuSpawn ( _) => ErrorKind :: Internal ,
248+ // The only user `LoadCommandline` error is `CommandLineOverflow`.
249+ StartMicrovmError :: LoadCommandline ( ref cle) => match cle {
250+ kernel_loader:: Error :: CommandLineOverflow => ErrorKind :: User ,
251+ _ => ErrorKind :: Internal ,
252+ } ,
253+ } ;
254+ VmmActionError :: StartMicrovm ( kind, e)
255+ }
256+ }
257+
215258impl VmmActionError {
216259 /// Returns the error type.
217260 pub fn get_kind ( & self ) -> & ErrorKind {
@@ -1175,51 +1218,36 @@ impl Vmm {
11751218 fn start_microvm ( & mut self ) -> std:: result:: Result < VmmData , VmmActionError > {
11761219 info ! ( "VMM received instance start command" ) ;
11771220 if self . is_instance_initialized ( ) {
1178- return Err ( VmmActionError :: StartMicrovm (
1179- ErrorKind :: User ,
1180- StartMicrovmError :: MicroVMAlreadyRunning ,
1181- ) ) ;
1221+ Err ( StartMicrovmError :: MicroVMAlreadyRunning ) ?;
11821222 }
11831223 let request_ts = TimestampUs {
11841224 time_us : get_time_us ( ) ,
11851225 cputime_us : now_cputime_us ( ) ,
11861226 } ;
11871227
1188- self . check_health ( )
1189- . map_err ( |e| VmmActionError :: StartMicrovm ( ErrorKind :: User , e) ) ?;
1228+ self . check_health ( ) ?;
11901229 // Use expect() to crash if the other thread poisoned this lock.
11911230 self . shared_info
11921231 . write ( )
11931232 . expect ( "Failed to start microVM because shared info couldn't be written due to poisoned lock" )
11941233 . state = InstanceState :: Starting ;
11951234
1196- self . init_guest_memory ( )
1197- . map_err ( |e| VmmActionError :: StartMicrovm ( ErrorKind :: Internal , e) ) ?;
1235+ self . init_guest_memory ( ) ?;
11981236
1199- self . setup_interrupt_controller ( )
1200- . map_err ( |e| VmmActionError :: StartMicrovm ( ErrorKind :: Internal , e) ) ?;
1237+ self . setup_interrupt_controller ( ) ?;
12011238
1202- self . attach_virtio_devices ( )
1203- . map_err ( |e| VmmActionError :: StartMicrovm ( ErrorKind :: Internal , e) ) ?;
1204- self . attach_legacy_devices ( )
1205- . map_err ( |e| VmmActionError :: StartMicrovm ( ErrorKind :: Internal , e) ) ?;
1239+ self . attach_virtio_devices ( ) ?;
1240+ self . attach_legacy_devices ( ) ?;
12061241
1207- let entry_addr = self
1208- . load_kernel ( )
1209- . map_err ( |e| VmmActionError :: StartMicrovm ( ErrorKind :: Internal , e) ) ?;
1242+ let entry_addr = self . load_kernel ( ) ?;
12101243
1211- self . configure_system ( )
1212- . map_err ( |e| VmmActionError :: StartMicrovm ( ErrorKind :: Internal , e) ) ?;
1244+ self . configure_system ( ) ?;
12131245
1214- self . register_events ( )
1215- . map_err ( |e| VmmActionError :: StartMicrovm ( ErrorKind :: Internal , e) ) ?;
1246+ self . register_events ( ) ?;
12161247
1217- let vcpus = self
1218- . create_vcpus ( entry_addr, request_ts)
1219- . map_err ( |e| VmmActionError :: StartMicrovm ( ErrorKind :: Internal , e) ) ?;
1248+ let vcpus = self . create_vcpus ( entry_addr, request_ts) ?;
12201249
1221- self . start_vcpus ( vcpus)
1222- . map_err ( |e| VmmActionError :: StartMicrovm ( ErrorKind :: Internal , e) ) ?;
1250+ self . start_vcpus ( vcpus) ?;
12231251 // Use expect() to crash if the other thread poisoned this lock.
12241252 self . shared_info
12251253 . write ( )
@@ -1989,7 +2017,6 @@ mod tests {
19892017 use super :: * ;
19902018
19912019 use serde_json:: Value ;
1992- use std:: env;
19932020 use std:: fs:: File ;
19942021 use std:: io:: BufRead ;
19952022 use std:: io:: BufReader ;
0 commit comments