Skip to content

Commit 9cfd0ab

Browse files
committed
refactor(vm-memory): use GuestMemoryCollection to store KVM slot
This refactor enables us to add more information to the GuestMemory. To start off, I am adding KVM slot number and type of memory. So far we only support Dram (normal memory), but we will also add Hotpluggable region type in the future. Signed-off-by: Riccardo Mancini <[email protected]>
1 parent 5c47cd7 commit 9cfd0ab

File tree

8 files changed

+248
-107
lines changed

8 files changed

+248
-107
lines changed

src/vmm/src/builder.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -171,7 +171,7 @@ pub fn build_microvm_for_boot(
171171
// Build custom CPU config if a custom template is provided.
172172
let mut vm = Vm::new(&kvm)?;
173173
let (mut vcpus, vcpus_exit_evt) = vm.create_vcpus(vm_resources.machine_config.vcpu_count)?;
174-
vm.register_memory_regions(guest_memory)?;
174+
vm.register_dram_memory_regions(guest_memory)?;
175175

176176
let mut device_manager = DeviceManager::new(
177177
event_manager,
@@ -421,7 +421,7 @@ pub fn build_microvm_from_snapshot(
421421
.create_vcpus(vm_resources.machine_config.vcpu_count)
422422
.map_err(StartMicrovmError::Vm)?;
423423

424-
vm.register_memory_regions(guest_memory)
424+
vm.restore_memory_regions(guest_memory, &microvm_state.vm_state.memory)
425425
.map_err(StartMicrovmError::Vm)?;
426426

427427
#[cfg(target_arch = "x86_64")]

src/vmm/src/device_manager/mmio.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -587,7 +587,7 @@ pub(crate) mod tests {
587587
let guest_mem = multi_region_mem_raw(&[(start_addr1, 0x1000), (start_addr2, 0x1000)]);
588588
let kvm = Kvm::new(vec![]).expect("Cannot create Kvm");
589589
let mut vm = Vm::new(&kvm).unwrap();
590-
vm.register_memory_regions(guest_mem).unwrap();
590+
vm.register_dram_memory_regions(guest_mem).unwrap();
591591
let mut device_manager = MMIODeviceManager::new();
592592

593593
let mut cmdline = kernel_cmdline::Cmdline::new(4096).unwrap();
@@ -633,7 +633,7 @@ pub(crate) mod tests {
633633
let guest_mem = multi_region_mem_raw(&[(start_addr1, 0x1000), (start_addr2, 0x1000)]);
634634
let kvm = Kvm::new(vec![]).expect("Cannot create Kvm");
635635
let mut vm = Vm::new(&kvm).unwrap();
636-
vm.register_memory_regions(guest_mem).unwrap();
636+
vm.register_dram_memory_regions(guest_mem).unwrap();
637637
let mut device_manager = MMIODeviceManager::new();
638638

639639
let mut cmdline = kernel_cmdline::Cmdline::new(4096).unwrap();
@@ -686,7 +686,7 @@ pub(crate) mod tests {
686686
let guest_mem = multi_region_mem_raw(&[(start_addr1, 0x1000), (start_addr2, 0x1000)]);
687687
let kvm = Kvm::new(vec![]).expect("Cannot create Kvm");
688688
let mut vm = Vm::new(&kvm).unwrap();
689-
vm.register_memory_regions(guest_mem).unwrap();
689+
vm.register_dram_memory_regions(guest_mem).unwrap();
690690

691691
#[cfg(target_arch = "x86_64")]
692692
vm.setup_irqchip().unwrap();

src/vmm/src/devices/virtio/block/virtio/io/mod.rs

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -179,14 +179,15 @@ pub mod tests {
179179
#![allow(clippy::undocumented_unsafe_blocks)]
180180
use std::os::unix::ffi::OsStrExt;
181181

182+
use vm_memory::GuestMemoryRegion;
182183
use vmm_sys_util::tempfile::TempFile;
183184

184185
use super::*;
185186
use crate::devices::virtio::block::virtio::device::FileEngineType;
186187
use crate::utils::u64_to_usize;
187188
use crate::vmm_config::machine_config::HugePageConfig;
188189
use crate::vstate::memory;
189-
use crate::vstate::memory::{Bitmap, Bytes, GuestMemory};
190+
use crate::vstate::memory::{Bitmap, Bytes, GuestMemory, GuestRegionMmapExt};
190191

191192
const FILE_LEN: u32 = 1024;
192193
// 2 pages of memory should be enough to test read/write ops and also dirty tracking.
@@ -227,20 +228,23 @@ pub mod tests {
227228
true,
228229
HugePageConfig::None,
229230
)
230-
.unwrap(),
231+
.unwrap()
232+
.into_iter()
233+
.map(|region| GuestRegionMmapExt::dram_from_mmap_region(region, 0))
234+
.collect(),
231235
)
232236
.unwrap()
233237
}
234238

235239
fn check_dirty_mem(mem: &GuestMemoryMmap, addr: GuestAddress, len: u32) {
236-
let bitmap = mem.find_region(addr).unwrap().bitmap().as_ref().unwrap();
240+
let bitmap = mem.find_region(addr).unwrap().bitmap();
237241
for offset in addr.0..addr.0 + u64::from(len) {
238242
assert!(bitmap.dirty_at(u64_to_usize(offset)));
239243
}
240244
}
241245

242246
fn check_clean_mem(mem: &GuestMemoryMmap, addr: GuestAddress, len: u32) {
243-
let bitmap = mem.find_region(addr).unwrap().bitmap().as_ref().unwrap();
247+
let bitmap = mem.find_region(addr).unwrap().bitmap();
244248
for offset in addr.0..addr.0 + u64::from(len) {
245249
assert!(!bitmap.dirty_at(u64_to_usize(offset)));
246250
}

src/vmm/src/devices/virtio/vhost_user.rs

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -378,7 +378,7 @@ impl<T: VhostUserHandleBackend> VhostUserHandleImpl<T> {
378378
let vhost_user_net_reg = VhostUserMemoryRegionInfo {
379379
guest_phys_addr: region.start_addr().raw_value(),
380380
memory_size: region.len(),
381-
userspace_addr: region.as_ptr() as u64,
381+
userspace_addr: region.inner.as_ptr() as u64,
382382
mmap_offset,
383383
mmap_handle,
384384
};
@@ -478,7 +478,7 @@ pub(crate) mod tests {
478478
use crate::devices::virtio::test_utils::default_interrupt;
479479
use crate::test_utils::create_tmp_socket;
480480
use crate::vstate::memory;
481-
use crate::vstate::memory::GuestAddress;
481+
use crate::vstate::memory::{GuestAddress, GuestRegionMmapExt};
482482

483483
pub(crate) fn create_mem(file: File, regions: &[(GuestAddress, usize)]) -> GuestMemoryMmap {
484484
GuestMemoryMmap::from_regions(
@@ -488,7 +488,10 @@ pub(crate) mod tests {
488488
Some(file),
489489
false,
490490
)
491-
.unwrap(),
491+
.unwrap()
492+
.into_iter()
493+
.map(|region| GuestRegionMmapExt::dram_from_mmap_region(region, 0))
494+
.collect(),
492495
)
493496
.unwrap()
494497
}
@@ -798,7 +801,7 @@ pub(crate) mod tests {
798801
.map(|region| VhostUserMemoryRegionInfo {
799802
guest_phys_addr: region.start_addr().raw_value(),
800803
memory_size: region.len(),
801-
userspace_addr: region.as_ptr() as u64,
804+
userspace_addr: region.inner.as_ptr() as u64,
802805
mmap_offset: region.file_offset().unwrap().start(),
803806
mmap_handle: region.file_offset().unwrap().file().as_raw_fd(),
804807
})

src/vmm/src/persist.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -588,7 +588,7 @@ mod tests {
588588
use crate::vmm_config::balloon::BalloonDeviceConfig;
589589
use crate::vmm_config::net::NetworkInterfaceConfig;
590590
use crate::vmm_config::vsock::tests::default_config;
591-
use crate::vstate::memory::GuestMemoryRegionState;
591+
use crate::vstate::memory::{GuestMemoryRegionState, GuestRegionType};
592592

593593
fn default_vmm_with_devices() -> Vmm {
594594
let mut event_manager = EventManager::new().expect("Cannot create EventManager");
@@ -693,6 +693,7 @@ mod tests {
693693
regions: vec![GuestMemoryRegionState {
694694
base_address: 0,
695695
size: 0x20000,
696+
region_type: GuestRegionType::Dram,
696697
}],
697698
};
698699

src/vmm/src/test_utils/mod.rs

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
use std::sync::{Arc, Mutex};
77

8-
use vm_memory::GuestAddress;
8+
use vm_memory::{GuestAddress, GuestRegionCollection};
99
use vmm_sys_util::tempdir::TempDir;
1010

1111
use crate::builder::build_microvm_for_boot;
@@ -16,7 +16,7 @@ use crate::vmm_config::boot_source::BootSourceConfig;
1616
use crate::vmm_config::instance_info::InstanceInfo;
1717
use crate::vmm_config::machine_config::HugePageConfig;
1818
use crate::vstate::memory;
19-
use crate::vstate::memory::{GuestMemoryMmap, GuestRegionMmap};
19+
use crate::vstate::memory::{GuestMemoryMmap, GuestRegionMmap, GuestRegionMmapExt};
2020
use crate::{EventManager, Vmm};
2121

2222
pub mod mock_resources;
@@ -43,9 +43,12 @@ pub fn single_region_mem_at_raw(at: u64, size: usize) -> Vec<GuestRegionMmap> {
4343

4444
/// Creates a [`GuestMemoryMmap`] with multiple regions and without dirty page tracking.
4545
pub fn multi_region_mem(regions: &[(GuestAddress, usize)]) -> GuestMemoryMmap {
46-
GuestMemoryMmap::from_regions(
46+
GuestRegionCollection::from_regions(
4747
memory::anonymous(regions.iter().copied(), false, HugePageConfig::None)
48-
.expect("Cannot initialize memory"),
48+
.expect("Cannot initialize memory")
49+
.into_iter()
50+
.map(|region| GuestRegionMmapExt::dram_from_mmap_region(region, 0))
51+
.collect(),
4952
)
5053
.unwrap()
5154
}

0 commit comments

Comments
 (0)