@@ -17,8 +17,8 @@ use kvm_ioctls::{Cap, VmFd};
1717use userfaultfd:: { FeatureFlags , Uffd , UffdBuilder } ;
1818use vmm_sys_util:: eventfd:: EventFd ;
1919
20- use crate :: arch:: host_page_size;
2120pub use crate :: arch:: { ArchVm as Vm , ArchVmError , VmState } ;
21+ use crate :: arch:: { Kvm , host_page_size} ;
2222use crate :: logger:: info;
2323use crate :: persist:: { CreateSnapshotError , GuestRegionUffdMapping } ;
2424use crate :: utils:: u64_to_usize;
@@ -72,7 +72,7 @@ pub enum VmError {
7272/// Contains Vm functions that are usable across CPU architectures
7373impl Vm {
7474 /// Create a KVM VM
75- pub fn create_common ( kvm : & crate :: vstate :: kvm :: Kvm ) -> Result < VmCommon , VmError > {
75+ pub fn create_common ( kvm : & Kvm , vm_type : Option < u64 > ) -> Result < VmCommon , VmError > {
7676 // It is known that KVM_CREATE_VM occasionally fails with EINTR on heavily loaded machines
7777 // with many VMs.
7878 //
@@ -96,7 +96,12 @@ impl Vm {
9696 const MAX_ATTEMPTS : u32 = 5 ;
9797 let mut attempt = 1 ;
9898 let fd = loop {
99- match kvm. fd . create_vm ( ) {
99+ let vm_res = match vm_type {
100+ Some ( r#type) => kvm. fd . create_vm_with_type ( r#type) ,
101+ None => kvm. fd . create_vm ( ) ,
102+ } ;
103+
104+ match vm_res {
100105 Ok ( fd) => break fd,
101106 Err ( e) if e. errno ( ) == libc:: EINTR && attempt < MAX_ATTEMPTS => {
102107 info ! ( "Attempt #{attempt} of KVM_CREATE_VM returned EINTR" ) ;
@@ -466,7 +471,7 @@ pub(crate) mod tests {
466471 // Auxiliary function being used throughout the tests.
467472 pub ( crate ) fn setup_vm ( ) -> ( Kvm , Vm ) {
468473 let kvm = Kvm :: new ( vec ! [ ] ) . expect ( "Cannot create Kvm" ) ;
469- let vm = Vm :: new ( & kvm) . expect ( "Cannot create new vm" ) ;
474+ let vm = Vm :: new ( & kvm, None ) . expect ( "Cannot create new vm" ) ;
470475 ( kvm, vm)
471476 }
472477
@@ -482,7 +487,7 @@ pub(crate) mod tests {
482487 fn test_new ( ) {
483488 // Testing with a valid /dev/kvm descriptor.
484489 let kvm = Kvm :: new ( vec ! [ ] ) . expect ( "Cannot create Kvm" ) ;
485- Vm :: new ( & kvm) . unwrap ( ) ;
490+ Vm :: new ( & kvm, None ) . unwrap ( ) ;
486491 }
487492
488493 #[ test]
0 commit comments