@@ -18,8 +18,8 @@ use kvm_ioctls::{Cap, VmFd};
1818use  userfaultfd:: { FeatureFlags ,  Uffd ,  UffdBuilder } ; 
1919use  vmm_sys_util:: eventfd:: EventFd ; 
2020
21- use  crate :: arch:: host_page_size; 
2221pub  use  crate :: arch:: { ArchVm  as  Vm ,  ArchVmError ,  VmState } ; 
22+ use  crate :: arch:: { Kvm ,  host_page_size} ; 
2323use  crate :: logger:: info; 
2424use  crate :: persist:: { CreateSnapshotError ,  GuestRegionUffdMapping } ; 
2525use  crate :: utils:: u64_to_usize; 
@@ -73,7 +73,7 @@ pub enum VmError {
7373/// Contains Vm functions that are usable across CPU architectures 
7474impl  Vm  { 
7575    /// Create a KVM VM 
76-      pub  fn  create_common ( kvm :  & crate :: vstate :: kvm :: Kvm )  -> Result < VmCommon ,  VmError >  { 
76+      pub  fn  create_common ( kvm :  & Kvm ,   vm_type :   Option < u64 > )  -> Result < VmCommon ,  VmError >  { 
7777        // It is known that KVM_CREATE_VM occasionally fails with EINTR on heavily loaded machines 
7878        // with many VMs. 
7979        // 
@@ -97,7 +97,12 @@ impl Vm {
9797        const  MAX_ATTEMPTS :  u32  = 5 ; 
9898        let  mut  attempt = 1 ; 
9999        let  fd = loop  { 
100-             match  kvm. fd . create_vm ( )  { 
100+             let  vm_res = match  vm_type { 
101+                 Some ( r#type)  => kvm. fd . create_vm_with_type ( r#type) , 
102+                 None  => kvm. fd . create_vm ( ) , 
103+             } ; 
104+ 
105+             match  vm_res { 
101106                Ok ( fd)  => break  fd, 
102107                Err ( e)  if  e. errno ( )  == libc:: EINTR  && attempt < MAX_ATTEMPTS  => { 
103108                    info ! ( "Attempt #{attempt} of KVM_CREATE_VM returned EINTR" ) ; 
@@ -460,7 +465,7 @@ pub(crate) mod tests {
460465    // Auxiliary function being used throughout the tests. 
461466    pub ( crate )  fn  setup_vm ( )  -> ( Kvm ,  Vm )  { 
462467        let  kvm = Kvm :: new ( vec ! [ ] ) . expect ( "Cannot create Kvm" ) ; 
463-         let  vm = Vm :: new ( & kvm) . expect ( "Cannot create new vm" ) ; 
468+         let  vm = Vm :: new ( & kvm,   None ) . expect ( "Cannot create new vm" ) ; 
464469        ( kvm,  vm) 
465470    } 
466471
@@ -476,7 +481,7 @@ pub(crate) mod tests {
476481    fn  test_new ( )  { 
477482        // Testing with a valid /dev/kvm descriptor. 
478483        let  kvm = Kvm :: new ( vec ! [ ] ) . expect ( "Cannot create Kvm" ) ; 
479-         Vm :: new ( & kvm) . unwrap ( ) ; 
484+         Vm :: new ( & kvm,   None ) . unwrap ( ) ; 
480485    } 
481486
482487    #[ test]  
0 commit comments