Skip to content

Commit b0f7c2a

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 6676fee commit b0f7c2a

File tree

8 files changed

+251
-109
lines changed

8 files changed

+251
-109
lines changed

src/vmm/src/builder.rs

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

173173
let mut device_manager = DeviceManager::new(
174174
event_manager,
@@ -411,7 +411,7 @@ pub fn build_microvm_from_snapshot(
411411
.create_vcpus(vm_resources.machine_config.vcpu_count)
412412
.map_err(StartMicrovmError::Vm)?;
413413

414-
vm.register_memory_regions(guest_memory)
414+
vm.restore_memory_regions(guest_memory, &microvm_state.vm_state.memory)
415415
.map_err(StartMicrovmError::Vm)?;
416416

417417
#[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
@@ -586,7 +586,7 @@ pub(crate) mod tests {
586586
let guest_mem = multi_region_mem_raw(&[(start_addr1, 0x1000), (start_addr2, 0x1000)]);
587587
let kvm = Kvm::new(vec![]).expect("Cannot create Kvm");
588588
let mut vm = Vm::new(&kvm).unwrap();
589-
vm.register_memory_regions(guest_mem).unwrap();
589+
vm.register_dram_memory_regions(guest_mem).unwrap();
590590
let mut device_manager = MMIODeviceManager::new();
591591

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

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

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

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

Lines changed: 6 additions & 2 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,7 +228,10 @@ 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
}

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

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -380,7 +380,7 @@ impl<T: VhostUserHandleBackend> VhostUserHandleImpl<T> {
380380
let vhost_user_net_reg = VhostUserMemoryRegionInfo {
381381
guest_phys_addr: region.start_addr().raw_value(),
382382
memory_size: region.len(),
383-
userspace_addr: region.as_ptr() as u64,
383+
userspace_addr: region.inner.as_ptr() as u64,
384384
mmap_offset,
385385
mmap_handle,
386386
};
@@ -480,7 +480,7 @@ pub(crate) mod tests {
480480
use crate::devices::virtio::test_utils::default_interrupt;
481481
use crate::test_utils::create_tmp_socket;
482482
use crate::vstate::memory;
483-
use crate::vstate::memory::GuestAddress;
483+
use crate::vstate::memory::{GuestAddress, GuestRegionMmapExt};
484484

485485
pub(crate) fn create_mem(file: File, regions: &[(GuestAddress, usize)]) -> GuestMemoryMmap {
486486
GuestMemoryMmap::from_regions(
@@ -490,7 +490,10 @@ pub(crate) mod tests {
490490
Some(file),
491491
false,
492492
)
493-
.unwrap(),
493+
.unwrap()
494+
.into_iter()
495+
.map(|region| GuestRegionMmapExt::dram_from_mmap_region(region, 0))
496+
.collect(),
494497
)
495498
.unwrap()
496499
}
@@ -800,7 +803,7 @@ pub(crate) mod tests {
800803
.map(|region| VhostUserMemoryRegionInfo {
801804
guest_phys_addr: region.start_addr().raw_value(),
802805
memory_size: region.len(),
803-
userspace_addr: region.as_ptr() as u64,
806+
userspace_addr: region.inner.as_ptr() as u64,
804807
mmap_offset: region.file_offset().unwrap().start(),
805808
mmap_handle: region.file_offset().unwrap().file().as_raw_fd(),
806809
})

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 & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,12 @@ use crate::builder::build_microvm_for_boot;
1212
use crate::resources::VmResources;
1313
use crate::seccomp::get_empty_filters;
1414
use crate::test_utils::mock_resources::{MockBootSourceConfig, MockVmConfig, MockVmResources};
15+
use crate::vm_memory_vendored::GuestRegionCollection;
1516
use crate::vmm_config::boot_source::BootSourceConfig;
1617
use crate::vmm_config::instance_info::InstanceInfo;
1718
use crate::vmm_config::machine_config::HugePageConfig;
1819
use crate::vstate::memory;
19-
use crate::vstate::memory::{GuestMemoryMmap, GuestRegionMmap};
20+
use crate::vstate::memory::{GuestMemoryMmap, GuestRegionMmap, GuestRegionMmapExt};
2021
use crate::{EventManager, Vmm};
2122

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

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

0 commit comments

Comments
 (0)