Skip to content

integrate vm-memory with dirty page tracking #2661

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 6 commits into from
Sep 17, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

9 changes: 6 additions & 3 deletions src/arch/src/aarch64/fdt.rs
Original file line number Diff line number Diff line change
Expand Up @@ -460,7 +460,8 @@ mod tests {
#[test]
fn test_create_fdt_with_devices() {
let regions = arch_memory_regions(layout::FDT_MAX_SIZE + 0x1000);
let mem = GuestMemoryMmap::from_ranges(&regions).expect("Cannot initialize memory");
let mem = vm_memory::test_utils::create_anon_guest_memory(&regions, false)
.expect("Cannot initialize memory");

let dev_info: HashMap<(DeviceType, std::string::String), MMIODeviceInfo> = [
(
Expand Down Expand Up @@ -499,7 +500,8 @@ mod tests {
#[test]
fn test_create_fdt() {
let regions = arch_memory_regions(layout::FDT_MAX_SIZE + 0x1000);
let mem = GuestMemoryMmap::from_ranges(&regions).expect("Cannot initialize memory");
let mem = vm_memory::test_utils::create_anon_guest_memory(&regions, false)
.expect("Cannot initialize memory");
let kvm = Kvm::new().unwrap();
let vm = kvm.create_vm().unwrap();
let gic = create_gic(&vm, 1, None).unwrap();
Expand Down Expand Up @@ -557,7 +559,8 @@ mod tests {
#[test]
fn test_create_fdt_with_initrd() {
let regions = arch_memory_regions(layout::FDT_MAX_SIZE + 0x1000);
let mem = GuestMemoryMmap::from_ranges(&regions).expect("Cannot initialize memory");
let mem = vm_memory::test_utils::create_anon_guest_memory(&regions, false)
.expect("Cannot initialize memory");
let kvm = Kvm::new().unwrap();
let vm = kvm.create_vm().unwrap();
let gic = create_gic(&vm, 1, None).unwrap();
Expand Down
9 changes: 6 additions & 3 deletions src/arch/src/aarch64/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -128,15 +128,18 @@ mod tests {
#[test]
fn test_get_fdt_addr() {
let regions = arch_memory_regions(layout::FDT_MAX_SIZE - 0x1000);
let mem = GuestMemoryMmap::from_ranges(&regions).expect("Cannot initialize memory");
let mem = vm_memory::test_utils::create_anon_guest_memory(&regions, false)
.expect("Cannot initialize memory");
assert_eq!(get_fdt_addr(&mem), layout::DRAM_MEM_START);

let regions = arch_memory_regions(layout::FDT_MAX_SIZE);
let mem = GuestMemoryMmap::from_ranges(&regions).expect("Cannot initialize memory");
let mem = vm_memory::test_utils::create_anon_guest_memory(&regions, false)
.expect("Cannot initialize memory");
assert_eq!(get_fdt_addr(&mem), layout::DRAM_MEM_START);

let regions = arch_memory_regions(layout::FDT_MAX_SIZE + 0x1000);
let mem = GuestMemoryMmap::from_ranges(&regions).expect("Cannot initialize memory");
let mem = vm_memory::test_utils::create_anon_guest_memory(&regions, false)
.expect("Cannot initialize memory");
assert_eq!(get_fdt_addr(&mem), 0x1000 + layout::DRAM_MEM_START);
}
}
3 changes: 2 additions & 1 deletion src/arch/src/aarch64/regs.rs
Original file line number Diff line number Diff line change
Expand Up @@ -461,7 +461,8 @@ mod tests {
let vm = kvm.create_vm().unwrap();
let vcpu = vm.create_vcpu(0).unwrap();
let regions = arch_memory_regions(layout::FDT_MAX_SIZE + 0x1000);
let mem = GuestMemoryMmap::from_ranges(&regions).expect("Cannot initialize memory");
let mem = vm_memory::test_utils::create_anon_guest_memory(&regions, false)
.expect("Cannot initialize memory");

let res = setup_boot_regs(&vcpu, 0, 0x0, &mem);
assert!(res.is_err());
Expand Down
10 changes: 6 additions & 4 deletions src/arch/src/x86_64/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -219,7 +219,9 @@ mod tests {
#[test]
fn test_system_configuration() {
let no_vcpus = 4;
let gm = GuestMemoryMmap::from_ranges(&[(GuestAddress(0), 0x10000)]).unwrap();
let gm =
vm_memory::test_utils::create_anon_guest_memory(&[(GuestAddress(0), 0x10000)], false)
.unwrap();
let config_err = configure_system(&gm, GuestAddress(0), 0, &None, 1);
assert!(config_err.is_err());
assert_eq!(
Expand All @@ -230,19 +232,19 @@ mod tests {
// Now assigning some memory that falls before the 32bit memory hole.
let mem_size = 128 << 20;
let arch_mem_regions = arch_memory_regions(mem_size);
let gm = GuestMemoryMmap::from_ranges(&arch_mem_regions).unwrap();
let gm = vm_memory::test_utils::create_anon_guest_memory(&arch_mem_regions, false).unwrap();
configure_system(&gm, GuestAddress(0), 0, &None, no_vcpus).unwrap();

// Now assigning some memory that is equal to the start of the 32bit memory hole.
let mem_size = 3328 << 20;
let arch_mem_regions = arch_memory_regions(mem_size);
let gm = GuestMemoryMmap::from_ranges(&arch_mem_regions).unwrap();
let gm = vm_memory::test_utils::create_anon_guest_memory(&arch_mem_regions, false).unwrap();
configure_system(&gm, GuestAddress(0), 0, &None, no_vcpus).unwrap();

// Now assigning some memory that falls after the 32bit memory hole.
let mem_size = 3330 << 20;
let arch_mem_regions = arch_memory_regions(mem_size);
let gm = GuestMemoryMmap::from_ranges(&arch_mem_regions).unwrap();
let gm = vm_memory::test_utils::create_anon_guest_memory(&arch_mem_regions, false).unwrap();
configure_system(&gm, GuestAddress(0), 0, &None, no_vcpus).unwrap();
}

Expand Down
51 changes: 27 additions & 24 deletions src/arch/src/x86_64/mptable.rs
Original file line number Diff line number Diff line change
Expand Up @@ -307,10 +307,10 @@ mod tests {
#[test]
fn bounds_check() {
let num_cpus = 4;
let mem = GuestMemoryMmap::from_ranges(&[(
GuestAddress(MPTABLE_START),
compute_mp_size(num_cpus),
)])
let mem = vm_memory::test_utils::create_guest_memory_unguarded(
&[(GuestAddress(MPTABLE_START), compute_mp_size(num_cpus))],
false,
)
.unwrap();

setup_mptable(&mem, num_cpus).unwrap();
Expand All @@ -319,10 +319,10 @@ mod tests {
#[test]
fn bounds_check_fails() {
let num_cpus = 4;
let mem = GuestMemoryMmap::from_ranges(&[(
GuestAddress(MPTABLE_START),
compute_mp_size(num_cpus) - 1,
)])
let mem = vm_memory::test_utils::create_guest_memory_unguarded(
&[(GuestAddress(MPTABLE_START), compute_mp_size(num_cpus) - 1)],
false,
)
.unwrap();

assert!(setup_mptable(&mem, num_cpus).is_err());
Expand All @@ -331,10 +331,10 @@ mod tests {
#[test]
fn mpf_intel_checksum() {
let num_cpus = 1;
let mem = GuestMemoryMmap::from_ranges(&[(
GuestAddress(MPTABLE_START),
compute_mp_size(num_cpus),
)])
let mem = vm_memory::test_utils::create_guest_memory_unguarded(
&[(GuestAddress(MPTABLE_START), compute_mp_size(num_cpus))],
false,
)
.unwrap();

setup_mptable(&mem, num_cpus).unwrap();
Expand All @@ -350,10 +350,10 @@ mod tests {
#[test]
fn mpc_table_checksum() {
let num_cpus = 4;
let mem = GuestMemoryMmap::from_ranges(&[(
GuestAddress(MPTABLE_START),
compute_mp_size(num_cpus),
)])
let mem = vm_memory::test_utils::create_guest_memory_unguarded(
&[(GuestAddress(MPTABLE_START), compute_mp_size(num_cpus))],
false,
)
.unwrap();

setup_mptable(&mem, num_cpus).unwrap();
Expand Down Expand Up @@ -383,10 +383,13 @@ mod tests {

#[test]
fn cpu_entry_count() {
let mem = GuestMemoryMmap::from_ranges(&[(
GuestAddress(MPTABLE_START),
compute_mp_size(MAX_SUPPORTED_CPUS as u8),
)])
let mem = vm_memory::test_utils::create_guest_memory_unguarded(
&[(
GuestAddress(MPTABLE_START),
compute_mp_size(MAX_SUPPORTED_CPUS as u8),
)],
false,
)
.unwrap();

for i in 0..MAX_SUPPORTED_CPUS as u8 {
Expand Down Expand Up @@ -420,10 +423,10 @@ mod tests {
#[test]
fn cpu_entry_count_max() {
let cpus = MAX_SUPPORTED_CPUS + 1;
let mem = GuestMemoryMmap::from_ranges(&[(
GuestAddress(MPTABLE_START),
compute_mp_size(cpus as u8),
)])
let mem = vm_memory::test_utils::create_guest_memory_unguarded(
&[(GuestAddress(MPTABLE_START), compute_mp_size(cpus as u8))],
false,
)
.unwrap();

let result = setup_mptable(&mem, cpus as u8).unwrap_err();
Expand Down
12 changes: 11 additions & 1 deletion src/arch/src/x86_64/regs.rs
Original file line number Diff line number Diff line change
Expand Up @@ -196,8 +196,18 @@ mod tests {
use vm_memory::{Bytes, GuestAddress, GuestMemoryMmap};

fn create_guest_mem(mem_size: Option<u64>) -> GuestMemoryMmap {
GuestMemoryMmap::from_ranges(&[(GuestAddress(0), mem_size.unwrap_or(0x10000) as usize)])
let page_size = 0x10000usize;
let mem_size = mem_size.unwrap_or(page_size as u64) as usize;
if mem_size % page_size == 0 {
vm_memory::test_utils::create_anon_guest_memory(&[(GuestAddress(0), mem_size)], false)
.unwrap()
} else {
vm_memory::test_utils::create_guest_memory_unguarded(
&[(GuestAddress(0), mem_size)],
false,
)
.unwrap()
}
}

fn read_u64(gm: &GuestMemoryMmap, offset: u64) -> u64 {
Expand Down
8 changes: 7 additions & 1 deletion src/devices/src/virtio/balloon/device.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1021,7 +1021,13 @@ pub(crate) mod tests {
// Assert that we can't update an inactive device.
assert!(balloon.update_size(1).is_err());
// Switch the state to active.
balloon.device_state = DeviceState::Activated(GuestMemoryMmap::new());
balloon.device_state = DeviceState::Activated(
vm_memory::test_utils::create_guest_memory_unguarded(
&[(GuestAddress(0x0), 0x1)],
false,
)
.unwrap(),
);

assert_eq!(balloon.num_pages(), 0);
assert_eq!(balloon.actual_pages(), 0);
Expand Down
12 changes: 10 additions & 2 deletions src/devices/src/virtio/balloon/utils.rs
Original file line number Diff line number Diff line change
Expand Up @@ -179,7 +179,11 @@ mod tests {
#[test]
fn test_remove_range() {
let page_size: usize = 0x1000;
let mem = GuestMemoryMmap::from_ranges(&[(GuestAddress(0), 2 * page_size)]).unwrap();
let mem = vm_memory::test_utils::create_anon_guest_memory(
&[(GuestAddress(0), 2 * page_size)],
false,
)
.unwrap();

// Fill the memory with ones.
let ones = vec![1u8; 2 * page_size];
Expand Down Expand Up @@ -223,7 +227,11 @@ mod tests {
#[test]
fn test_remove_range_on_restored() {
let page_size: usize = 0x1000;
let mem = GuestMemoryMmap::from_ranges(&[(GuestAddress(0), 2 * page_size)]).unwrap();
let mem = vm_memory::test_utils::create_anon_guest_memory(
&[(GuestAddress(0), 2 * page_size)],
false,
)
.unwrap();

// Fill the memory with ones.
let ones = vec![1u8; 2 * page_size];
Expand Down
25 changes: 14 additions & 11 deletions src/devices/src/virtio/block/request.rs
Original file line number Diff line number Diff line change
Expand Up @@ -332,13 +332,13 @@ mod tests {

use crate::virtio::queue::tests::*;
use crate::virtio::test_utils::{VirtQueue, VirtqDesc};
use vm_memory::{Address, GuestAddress, GuestMemory};
use vm_memory::{test_utils::create_anon_guest_memory, Address, GuestAddress, GuestMemory};

const NUM_DISK_SECTORS: u64 = 1024;

#[test]
fn test_read_request_header() {
let mem = GuestMemoryMmap::from_ranges(&[(GuestAddress(0), 0x1000)]).unwrap();
let mem = create_anon_guest_memory(&[(GuestAddress(0), 0x1000)], false).unwrap();
let addr = GuestAddress(0);
let sector = 123_454_321;

Expand Down Expand Up @@ -539,7 +539,7 @@ mod tests {

#[test]
fn test_parse_generic() {
let mem = &GuestMemoryMmap::from_ranges(&[(GuestAddress(0), 0x10000)]).unwrap();
let mem = &create_anon_guest_memory(&[(GuestAddress(0), 0x10000)], false).unwrap();
let mut queue = RequestVirtQueue::new(GuestAddress(0), &mem);

// Write only request type descriptor.
Expand Down Expand Up @@ -589,7 +589,7 @@ mod tests {

#[test]
fn test_parse_in() {
let mem = &GuestMemoryMmap::from_ranges(&[(GuestAddress(0), 0x10000)]).unwrap();
let mem = &create_anon_guest_memory(&[(GuestAddress(0), 0x10000)], false).unwrap();
let mut queue = RequestVirtQueue::new(GuestAddress(0), &mem);

let request_header = RequestHeader::new(VIRTIO_BLK_T_IN, 99);
Expand Down Expand Up @@ -620,7 +620,7 @@ mod tests {

#[test]
fn test_parse_out() {
let mem = &GuestMemoryMmap::from_ranges(&[(GuestAddress(0), 0x10000)]).unwrap();
let mem = &create_anon_guest_memory(&[(GuestAddress(0), 0x10000)], false).unwrap();
let mut queue = RequestVirtQueue::new(GuestAddress(0), &mem);

let request_header = RequestHeader::new(VIRTIO_BLK_T_OUT, 100);
Expand Down Expand Up @@ -648,7 +648,7 @@ mod tests {

#[test]
fn test_parse_flush() {
let mem = &GuestMemoryMmap::from_ranges(&[(GuestAddress(0), 0x10000)]).unwrap();
let mem = &create_anon_guest_memory(&[(GuestAddress(0), 0x10000)], false).unwrap();
let mut queue = RequestVirtQueue::new(GuestAddress(0), &mem);

// Flush request with a data descriptor.
Expand All @@ -668,7 +668,7 @@ mod tests {

#[test]
fn test_parse_get_id() {
let mem = &GuestMemoryMmap::from_ranges(&[(GuestAddress(0), 0x10000)]).unwrap();
let mem = &create_anon_guest_memory(&[(GuestAddress(0), 0x10000)], false).unwrap();
let mut queue = RequestVirtQueue::new(GuestAddress(0), &mem);

let request_header = RequestHeader::new(VIRTIO_BLK_T_GET_ID, 15);
Expand Down Expand Up @@ -830,10 +830,13 @@ mod tests {
let status_addr = data_addr.checked_add(next_desc_dist).unwrap();

let mem_end = status_addr.checked_add(max_desc_len).unwrap();
let mem: GuestMemoryMmap = GuestMemoryMmap::from_ranges(&[(
GuestAddress(base_addr),
(mem_end.0 - base_addr).try_into().unwrap(),
)])
let mem: GuestMemoryMmap = create_anon_guest_memory(
&[(
GuestAddress(base_addr),
(mem_end.0 - base_addr).try_into().unwrap(),
)],
false,
)
.unwrap();

let mut rq = RequestVirtQueue::new(GuestAddress(base_addr), &mem);
Expand Down
Loading