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