Skip to content

Commit ebb5f71

Browse files
committed
Keep track of kvm memslot index inside GuestMemoryMmap
Use a special KvmRegion type, which allows us to manage kvm_userspace_memory_region2 inside of GuestRegionCollection. Signed-off-by: Patrick Roy <roypat@amazon.co.uk>
1 parent 1fc108a commit ebb5f71

File tree

10 files changed

+204
-82
lines changed

10 files changed

+204
-82
lines changed

Cargo.lock

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/vmm/src/arch/aarch64/mod.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,9 @@ pub fn configure_system_for_boot(
117117
)?;
118118

119119
let fdt_address = GuestAddress(get_fdt_addr(vmm.vm.guest_memory()));
120-
vmm.vm.guest_memory().write_slice(fdt.as_slice(), fdt_address)?;
120+
vmm.vm
121+
.guest_memory()
122+
.write_slice(fdt.as_slice(), fdt_address)?;
121123

122124
Ok(())
123125
}

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

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -378,7 +378,7 @@ mod tests {
378378
use crate::devices::virtio::mmio::VIRTIO_MMIO_INT_CONFIG;
379379
use crate::test_utils::create_tmp_socket;
380380
use crate::vstate::memory;
381-
use crate::vstate::memory::GuestAddress;
381+
use crate::vstate::memory::{GuestAddress, KvmRegion};
382382

383383
#[test]
384384
fn test_from_config() {
@@ -780,7 +780,11 @@ mod tests {
780780
file.set_len(region_size as u64).unwrap();
781781
let regions = vec![(GuestAddress(0x0), region_size)];
782782
let guest_memory = GuestMemoryMmap::from_regions(
783-
memory::create(regions.into_iter(), libc::MAP_PRIVATE, Some(file), false).unwrap(),
783+
memory::create(regions.into_iter(), libc::MAP_PRIVATE, Some(file), false)
784+
.unwrap()
785+
.into_iter()
786+
.map(|region| KvmRegion::from_mmap_region(region, 0))
787+
.collect(),
784788
)
785789
.unwrap();
786790

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

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -188,14 +188,15 @@ pub mod tests {
188188
#![allow(clippy::undocumented_unsafe_blocks)]
189189
use std::os::unix::ffi::OsStrExt;
190190

191+
use vm_memory::GuestMemoryRegion;
191192
use vmm_sys_util::tempfile::TempFile;
192193

193194
use super::*;
194195
use crate::devices::virtio::block::virtio::device::FileEngineType;
195196
use crate::utils::u64_to_usize;
196197
use crate::vmm_config::machine_config::HugePageConfig;
197198
use crate::vstate::memory;
198-
use crate::vstate::memory::{Bitmap, Bytes, GuestMemory};
199+
use crate::vstate::memory::{Bitmap, Bytes, GuestMemory, KvmRegion};
199200

200201
const FILE_LEN: u32 = 1024;
201202
// 2 pages of memory should be enough to test read/write ops and also dirty tracking.
@@ -237,7 +238,10 @@ pub mod tests {
237238
true,
238239
HugePageConfig::None,
239240
)
240-
.unwrap(),
241+
.unwrap()
242+
.into_iter()
243+
.map(|region| KvmRegion::from_mmap_region(region, 0))
244+
.collect(),
241245
)
242246
.unwrap()
243247
}

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

Lines changed: 13 additions & 5 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().userspace_addr,
384384
mmap_offset,
385385
mmap_handle,
386386
};
@@ -467,7 +467,7 @@ mod tests {
467467
use super::*;
468468
use crate::test_utils::create_tmp_socket;
469469
use crate::vstate::memory;
470-
use crate::vstate::memory::GuestAddress;
470+
use crate::vstate::memory::{GuestAddress, KvmRegion};
471471

472472
#[test]
473473
fn test_new() {
@@ -765,7 +765,11 @@ mod tests {
765765
];
766766

767767
let guest_memory = GuestMemoryMmap::from_regions(
768-
memory::create(regions.into_iter(), libc::MAP_PRIVATE, Some(file), false).unwrap(),
768+
memory::create(regions.into_iter(), libc::MAP_PRIVATE, Some(file), false)
769+
.unwrap()
770+
.into_iter()
771+
.map(|region| KvmRegion::from_mmap_region(region, 0))
772+
.collect(),
769773
)
770774
.unwrap();
771775

@@ -777,7 +781,7 @@ mod tests {
777781
.map(|region| VhostUserMemoryRegionInfo {
778782
guest_phys_addr: region.start_addr().raw_value(),
779783
memory_size: region.len(),
780-
userspace_addr: region.as_ptr() as u64,
784+
userspace_addr: region.inner().userspace_addr,
781785
mmap_offset: region.file_offset().unwrap().start(),
782786
mmap_handle: region.file_offset().unwrap().file().as_raw_fd(),
783787
})
@@ -882,7 +886,11 @@ mod tests {
882886
let regions = vec![(GuestAddress(0x0), region_size)];
883887

884888
let guest_memory = GuestMemoryMmap::from_regions(
885-
memory::create(regions.into_iter(), libc::MAP_PRIVATE, Some(file), false).unwrap(),
889+
memory::create(regions.into_iter(), libc::MAP_PRIVATE, Some(file), false)
890+
.unwrap()
891+
.into_iter()
892+
.map(|region| KvmRegion::from_mmap_region(region, 0))
893+
.collect(),
886894
)
887895
.unwrap();
888896

src/vmm/src/gdb/arch/aarch64.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,9 @@ const PTE_ADDRESS_MASK: u64 = !0b111u64;
6363
/// Read a u64 value from a guest memory address
6464
fn read_address(vmm: &Vmm, address: u64) -> Result<u64, GdbTargetError> {
6565
let mut buf = [0; 8];
66-
vmm.vm.guest_memory().read(&mut buf, GuestAddress(address))?;
66+
vmm.vm
67+
.guest_memory()
68+
.read(&mut buf, GuestAddress(address))?;
6769

6870
Ok(u64::from_le_bytes(buf))
6971
}

src/vmm/src/gdb/target.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -399,7 +399,8 @@ impl MultiThreadBase for FirecrackerTarget {
399399
GUEST_PAGE_SIZE - (u64_to_usize(gpa) & (GUEST_PAGE_SIZE - 1)),
400400
);
401401

402-
vmm.vm.guest_memory()
402+
vmm.vm
403+
.guest_memory()
403404
.read(&mut data[..read_len], GuestAddress(gpa as u64))
404405
.map_err(|e| {
405406
error!("Error reading memory {e:?} gpa is {gpa}");
@@ -433,7 +434,8 @@ impl MultiThreadBase for FirecrackerTarget {
433434
GUEST_PAGE_SIZE - (u64_to_usize(gpa) & (GUEST_PAGE_SIZE - 1)),
434435
);
435436

436-
vmm.vm.guest_memory()
437+
vmm.vm
438+
.guest_memory()
437439
.write(&data[..write_len], GuestAddress(gpa))
438440
.map_err(|e| {
439441
error!("Error {e:?} writing memory at {gpa:#X}");

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, KvmRegion};
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| KvmRegion::from_mmap_region(region, 0))
51+
.collect(),
4952
)
5053
.unwrap()
5154
}

0 commit comments

Comments
 (0)