@@ -12,7 +12,10 @@ use std::os::fd::FromRawFd;
1212use std:: path:: Path ;
1313use std:: sync:: Arc ;
1414
15- use kvm_bindings:: { KVM_MEM_LOG_DIRTY_PAGES , kvm_create_guest_memfd, kvm_userspace_memory_region} ;
15+ use kvm_bindings:: {
16+ KVM_MEM_LOG_DIRTY_PAGES , kvm_create_guest_memfd, kvm_userspace_memory_region,
17+ kvm_userspace_memory_region2,
18+ } ;
1619use kvm_ioctls:: { Cap , VmFd } ;
1720use vmm_sys_util:: eventfd:: EventFd ;
1821
@@ -185,21 +188,37 @@ impl Vm {
185188 0
186189 } ;
187190
188- let memory_region = kvm_userspace_memory_region {
191+ let memory_region = kvm_userspace_memory_region2 {
189192 slot : next_slot,
190193 guest_phys_addr : region. start_addr ( ) . raw_value ( ) ,
191194 memory_size : region. len ( ) ,
192195 userspace_addr : region. as_ptr ( ) as u64 ,
193196 flags,
197+ ..Default :: default ( )
194198 } ;
195199
196200 let new_guest_memory = self . common . guest_memory . insert_region ( Arc :: new ( region) ) ?;
197201
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 ) ?;
202+ if self . fd ( ) . check_extension ( Cap :: UserMemory2 ) {
203+ // SAFETY: We are passing a valid memory region and operate on a valid KVM FD.
204+ unsafe {
205+ self . fd ( )
206+ . set_user_memory_region2 ( memory_region)
207+ . map_err ( VmError :: SetUserMemoryRegion ) ?;
208+ }
209+ } else {
210+ // SAFETY: We are passing a valid memory region and operate on a valid KVM FD.
211+ unsafe {
212+ self . fd ( )
213+ . set_user_memory_region ( kvm_userspace_memory_region {
214+ slot : memory_region. slot ,
215+ flags : memory_region. flags ,
216+ guest_phys_addr : memory_region. guest_phys_addr ,
217+ memory_size : memory_region. memory_size ,
218+ userspace_addr : memory_region. userspace_addr ,
219+ } )
220+ . map_err ( VmError :: SetUserMemoryRegion ) ?;
221+ }
203222 }
204223
205224 self . common . guest_memory = new_guest_memory;
0 commit comments