Skip to content

Commit 501eb3e

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 34bcea5 commit 501eb3e

File tree

8 files changed

+258
-93
lines changed

8 files changed

+258
-93
lines changed

src/vmm/src/builder.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -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/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, GuestMemoryRegionExt};
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| GuestMemoryRegionExt::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, GuestMemoryRegionExt};
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| GuestMemoryRegionExt::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, GuestMemoryRegionExt};
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| GuestMemoryRegionExt::dram_from_mmap_region(region, 0))
52+
.collect(),
4953
)
5054
.unwrap()
5155
}

src/vmm/src/vm_memory_vendored.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ use vm_memory::{
1717
GuestMemoryRegion, MemoryRegionAddress,
1818
};
1919

20-
use crate::vstate::memory::SlottedGuestMemoryRegion;
20+
use crate::vstate::memory::GuestMemoryRegionExt;
2121

2222
/// [`GuestMemory`](trait.GuestMemory.html) implementation based on a homogeneous collection
2323
/// of [`GuestMemoryRegion`] implementations.
@@ -126,7 +126,7 @@ impl<R: GuestMemoryRegion> GuestMemory for GuestRegionCollection<R> {
126126
}
127127

128128
// This impl will be subsumed by the default impl in vm-memory#312
129-
impl Bytes<MemoryRegionAddress> for SlottedGuestMemoryRegion {
129+
impl Bytes<MemoryRegionAddress> for GuestMemoryRegionExt {
130130
type E = GuestMemoryError;
131131

132132
/// # Examples

0 commit comments

Comments
 (0)