@@ -12,7 +12,7 @@ use std::os::fd::FromRawFd;
1212use std:: path:: Path ;
1313use std:: sync:: Arc ;
1414
15- use kvm_bindings:: { kvm_create_guest_memfd, kvm_userspace_memory_region, KVM_MEM_LOG_DIRTY_PAGES } ;
15+ use kvm_bindings:: { kvm_create_guest_memfd, kvm_userspace_memory_region, kvm_userspace_memory_region2 , KVM_MEM_LOG_DIRTY_PAGES } ;
1616use kvm_ioctls:: { Cap , VmFd } ;
1717use vmm_sys_util:: eventfd:: EventFd ;
1818
@@ -185,21 +185,37 @@ impl Vm {
185185 0
186186 } ;
187187
188- let memory_region = kvm_userspace_memory_region {
188+ let memory_region = kvm_userspace_memory_region2 {
189189 slot : next_slot,
190190 guest_phys_addr : region. start_addr ( ) . raw_value ( ) ,
191191 memory_size : region. len ( ) ,
192192 userspace_addr : region. as_ptr ( ) as u64 ,
193193 flags,
194+ ..Default :: default ( )
194195 } ;
195196
196197 let new_guest_memory = self . common . guest_memory . insert_region ( Arc :: new ( region) ) ?;
197198
198- // SAFETY: Safe because the fd is a valid KVM file descriptor.
199- unsafe {
200- self . fd ( )
201- . set_user_memory_region ( memory_region)
202- . map_err ( VmError :: SetUserMemoryRegion ) ?;
199+ if self . fd ( ) . check_extension ( Cap :: UserMemory2 ) {
200+ // SAFETY: We are passing a valid memory region and operate on a valid KVM FD.
201+ unsafe {
202+ self . fd ( )
203+ . set_user_memory_region2 ( memory_region)
204+ . map_err ( VmError :: SetUserMemoryRegion ) ?;
205+ }
206+ } else {
207+ // SAFETY: We are passing a valid memory region and operate on a valid KVM FD.
208+ unsafe {
209+ self . fd ( )
210+ . set_user_memory_region ( kvm_userspace_memory_region {
211+ slot : memory_region. slot ,
212+ flags : memory_region. flags ,
213+ guest_phys_addr : memory_region. guest_phys_addr ,
214+ memory_size : memory_region. memory_size ,
215+ userspace_addr : memory_region. userspace_addr ,
216+ } )
217+ . map_err ( VmError :: SetUserMemoryRegion ) ?;
218+ }
203219 }
204220
205221 self . common . guest_memory = new_guest_memory;
0 commit comments