@@ -12,7 +12,7 @@ use std::os::fd::FromRawFd;
12
12
use std:: path:: Path ;
13
13
use std:: sync:: Arc ;
14
14
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 } ;
16
16
use kvm_ioctls:: { Cap , VmFd } ;
17
17
use vmm_sys_util:: eventfd:: EventFd ;
18
18
@@ -185,21 +185,37 @@ impl Vm {
185
185
0
186
186
} ;
187
187
188
- let memory_region = kvm_userspace_memory_region {
188
+ let memory_region = kvm_userspace_memory_region2 {
189
189
slot : next_slot,
190
190
guest_phys_addr : region. start_addr ( ) . raw_value ( ) ,
191
191
memory_size : region. len ( ) ,
192
192
userspace_addr : region. as_ptr ( ) as u64 ,
193
193
flags,
194
+ ..Default :: default ( )
194
195
} ;
195
196
196
197
let new_guest_memory = self . common . guest_memory . insert_region ( Arc :: new ( region) ) ?;
197
198
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
+ }
203
219
}
204
220
205
221
self . common . guest_memory = new_guest_memory;
0 commit comments