@@ -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" ) ;
@@ -458,7 +463,7 @@ pub(crate) mod tests {
458463 // Auxiliary function being used throughout the tests.
459464 pub ( crate ) fn setup_vm ( ) -> ( Kvm , Vm ) {
460465 let kvm = Kvm :: new ( vec ! [ ] ) . expect ( "Cannot create Kvm" ) ;
461- let vm = Vm :: new ( & kvm) . expect ( "Cannot create new vm" ) ;
466+ let vm = Vm :: new ( & kvm, None ) . expect ( "Cannot create new vm" ) ;
462467 ( kvm, vm)
463468 }
464469
@@ -474,7 +479,7 @@ pub(crate) mod tests {
474479 fn test_new ( ) {
475480 // Testing with a valid /dev/kvm descriptor.
476481 let kvm = Kvm :: new ( vec ! [ ] ) . expect ( "Cannot create Kvm" ) ;
477- Vm :: new ( & kvm) . unwrap ( ) ;
482+ Vm :: new ( & kvm, None ) . unwrap ( ) ;
478483 }
479484
480485 #[ test]
0 commit comments