@@ -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;
@@ -71,7 +71,7 @@ pub enum VmError {
7171/// Contains Vm functions that are usable across CPU architectures
7272impl Vm {
7373 /// Create a KVM VM
74- pub fn create_common ( kvm : & crate :: vstate :: kvm :: Kvm ) -> Result < VmCommon , VmError > {
74+ pub fn create_common ( kvm : & Kvm , vm_type : Option < u64 > ) -> Result < VmCommon , VmError > {
7575 // It is known that KVM_CREATE_VM occasionally fails with EINTR on heavily loaded machines
7676 // with many VMs.
7777 //
@@ -95,7 +95,12 @@ impl Vm {
9595 const MAX_ATTEMPTS : u32 = 5 ;
9696 let mut attempt = 1 ;
9797 let fd = loop {
98- match kvm. fd . create_vm ( ) {
98+ let vm_res = match vm_type {
99+ Some ( r#type) => kvm. fd . create_vm_with_type ( r#type) ,
100+ None => kvm. fd . create_vm ( ) ,
101+ } ;
102+
103+ match vm_res {
99104 Ok ( fd) => break fd,
100105 Err ( e) if e. errno ( ) == libc:: EINTR && attempt < MAX_ATTEMPTS => {
101106 info ! ( "Attempt #{attempt} of KVM_CREATE_VM returned EINTR" ) ;
@@ -451,7 +456,7 @@ pub(crate) mod tests {
451456 // Auxiliary function being used throughout the tests.
452457 pub ( crate ) fn setup_vm ( ) -> ( Kvm , Vm ) {
453458 let kvm = Kvm :: new ( vec ! [ ] ) . expect ( "Cannot create Kvm" ) ;
454- let vm = Vm :: new ( & kvm) . expect ( "Cannot create new vm" ) ;
459+ let vm = Vm :: new ( & kvm, None ) . expect ( "Cannot create new vm" ) ;
455460 ( kvm, vm)
456461 }
457462
@@ -467,7 +472,7 @@ pub(crate) mod tests {
467472 fn test_new ( ) {
468473 // Testing with a valid /dev/kvm descriptor.
469474 let kvm = Kvm :: new ( vec ! [ ] ) . expect ( "Cannot create Kvm" ) ;
470- Vm :: new ( & kvm) . unwrap ( ) ;
475+ Vm :: new ( & kvm, None ) . unwrap ( ) ;
471476 }
472477
473478 #[ test]
0 commit comments