@@ -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