Skip to content

Commit 11ac487

Browse files
committed
refactor: Consolidate test-only memory creation utilities
Consolidates the jungle of functions out unit tests use to allocate (mock) guest memory into three central utility functions. The main intention behind this is to (mostly) prevent unit tests from calling GuestMemoryMmap::from_raw_regions because that function will gain a huge pages related parameter, and I dont want to have to touch 349082 files in the feature commit that introduces it. This will also make it easier to later on switch our unittests to use memfd based memory instead of anonymous memory once vhost snapshot support is done. After this commit, the only places that directly use from_raw_regions are the tests in memory.rs itself (because they test from_raw_regions, and not the utility wrappers), and any call sites that deviate from the defaults chosen in test_utils.rs (e.g. if something wants dirty page tracking). The test being removed in this commit duplicates test_from_raw_regions in memory.rs. Signed-off-by: Patrick Roy <[email protected]>
1 parent cf6b0f0 commit 11ac487

File tree

21 files changed

+132
-218
lines changed

21 files changed

+132
-218
lines changed

src/vmm/src/arch/aarch64/fdt.rs

Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -427,8 +427,8 @@ mod tests {
427427

428428
use super::*;
429429
use crate::arch::aarch64::gic::create_gic;
430-
use crate::arch::aarch64::{arch_memory_regions, layout};
431-
use crate::vstate::memory::{GuestMemoryExtension, GuestMemoryMmap};
430+
use crate::arch::aarch64::layout;
431+
use crate::utilities::test_utils::arch_mem;
432432

433433
const LEN: u64 = 4096;
434434

@@ -460,9 +460,7 @@ mod tests {
460460

461461
#[test]
462462
fn test_create_fdt_with_devices() {
463-
let regions = arch_memory_regions(layout::FDT_MAX_SIZE + 0x1000);
464-
let mem =
465-
GuestMemoryMmap::from_raw_regions(&regions, false).expect("Cannot initialize memory");
463+
let mem = arch_mem(layout::FDT_MAX_SIZE + 0x1000);
466464

467465
let dev_info: HashMap<(DeviceType, std::string::String), MMIODeviceInfo> = [
468466
(
@@ -500,9 +498,7 @@ mod tests {
500498

501499
#[test]
502500
fn test_create_fdt() {
503-
let regions = arch_memory_regions(layout::FDT_MAX_SIZE + 0x1000);
504-
let mem =
505-
GuestMemoryMmap::from_raw_regions(&regions, false).expect("Cannot initialize memory");
501+
let mem = arch_mem(layout::FDT_MAX_SIZE + 0x1000);
506502
let kvm = Kvm::new().unwrap();
507503
let vm = kvm.create_vm().unwrap();
508504
let gic = create_gic(&vm, 1, None).unwrap();
@@ -558,9 +554,7 @@ mod tests {
558554

559555
#[test]
560556
fn test_create_fdt_with_initrd() {
561-
let regions = arch_memory_regions(layout::FDT_MAX_SIZE + 0x1000);
562-
let mem =
563-
GuestMemoryMmap::from_raw_regions(&regions, false).expect("Cannot initialize memory");
557+
let mem = arch_mem(layout::FDT_MAX_SIZE + 0x1000);
564558
let kvm = Kvm::new().unwrap();
565559
let vm = kvm.create_vm().unwrap();
566560
let gic = create_gic(&vm, 1, None).unwrap();

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

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,7 @@ fn get_fdt_addr(mem: &GuestMemoryMmap) -> u64 {
114114
#[cfg(test)]
115115
mod tests {
116116
use super::*;
117-
use crate::vstate::memory::GuestMemoryExtension;
117+
use crate::utilities::test_utils::arch_mem;
118118

119119
#[test]
120120
fn test_regions_lt_1024gb() {
@@ -134,19 +134,13 @@ mod tests {
134134

135135
#[test]
136136
fn test_get_fdt_addr() {
137-
let regions = arch_memory_regions(layout::FDT_MAX_SIZE - 0x1000);
138-
let mem =
139-
GuestMemoryMmap::from_raw_regions(&regions, false).expect("Cannot initialize memory");
137+
let mem = arch_mem(layout::FDT_MAX_SIZE - 0x1000);
140138
assert_eq!(get_fdt_addr(&mem), layout::DRAM_MEM_START);
141139

142-
let regions = arch_memory_regions(layout::FDT_MAX_SIZE);
143-
let mem =
144-
GuestMemoryMmap::from_raw_regions(&regions, false).expect("Cannot initialize memory");
140+
let mem = arch_mem(layout::FDT_MAX_SIZE);
145141
assert_eq!(get_fdt_addr(&mem), layout::DRAM_MEM_START);
146142

147-
let regions = arch_memory_regions(layout::FDT_MAX_SIZE + 0x1000);
148-
let mem =
149-
GuestMemoryMmap::from_raw_regions(&regions, false).expect("Cannot initialize memory");
143+
let mem = arch_mem(layout::FDT_MAX_SIZE + 0x1000);
150144
assert_eq!(get_fdt_addr(&mem), 0x1000 + layout::DRAM_MEM_START);
151145
}
152146
}

src/vmm/src/arch/aarch64/vcpu.rs

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -218,17 +218,15 @@ mod tests {
218218
use kvm_ioctls::Kvm;
219219

220220
use super::*;
221-
use crate::arch::aarch64::{arch_memory_regions, layout};
222-
use crate::vstate::memory::GuestMemoryExtension;
221+
use crate::arch::aarch64::layout;
222+
use crate::utilities::test_utils::arch_mem;
223223

224224
#[test]
225225
fn test_setup_regs() {
226226
let kvm = Kvm::new().unwrap();
227227
let vm = kvm.create_vm().unwrap();
228228
let vcpu = vm.create_vcpu(0).unwrap();
229-
let regions = arch_memory_regions(layout::FDT_MAX_SIZE + 0x1000);
230-
let mem =
231-
GuestMemoryMmap::from_raw_regions(&regions, false).expect("Cannot initialize memory");
229+
let mem = arch_mem(layout::FDT_MAX_SIZE + 0x1000);
232230

233231
let res = setup_boot_regs(&vcpu, 0, 0x0, &mem);
234232
assert!(matches!(

src/vmm/src/arch/x86_64/mod.rs

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -210,7 +210,7 @@ mod tests {
210210
use linux_loader::loader::bootparam::boot_e820_entry;
211211

212212
use super::*;
213-
use crate::vstate::memory::GuestMemoryExtension;
213+
use crate::utilities::test_utils::{arch_mem, single_region_mem};
214214

215215
#[test]
216216
fn regions_lt_4gb() {
@@ -231,7 +231,7 @@ mod tests {
231231
#[test]
232232
fn test_system_configuration() {
233233
let no_vcpus = 4;
234-
let gm = GuestMemoryMmap::from_raw_regions(&[(GuestAddress(0), 0x10000)], false).unwrap();
234+
let gm = single_region_mem(0x10000);
235235
let config_err = configure_system(&gm, GuestAddress(0), 0, &None, 1);
236236
assert_eq!(
237237
config_err.unwrap_err(),
@@ -240,20 +240,17 @@ mod tests {
240240

241241
// Now assigning some memory that falls before the 32bit memory hole.
242242
let mem_size = 128 << 20;
243-
let arch_mem_regions = arch_memory_regions(mem_size);
244-
let gm = GuestMemoryMmap::from_raw_regions(&arch_mem_regions, false).unwrap();
243+
let gm = arch_mem(mem_size);
245244
configure_system(&gm, GuestAddress(0), 0, &None, no_vcpus).unwrap();
246245

247246
// Now assigning some memory that is equal to the start of the 32bit memory hole.
248247
let mem_size = 3328 << 20;
249-
let arch_mem_regions = arch_memory_regions(mem_size);
250-
let gm = GuestMemoryMmap::from_raw_regions(&arch_mem_regions, false).unwrap();
248+
let gm = arch_mem(mem_size);
251249
configure_system(&gm, GuestAddress(0), 0, &None, no_vcpus).unwrap();
252250

253251
// Now assigning some memory that falls after the 32bit memory hole.
254252
let mem_size = 3330 << 20;
255-
let arch_mem_regions = arch_memory_regions(mem_size);
256-
let gm = GuestMemoryMmap::from_raw_regions(&arch_mem_regions, false).unwrap();
253+
let gm = arch_mem(mem_size);
257254
configure_system(&gm, GuestAddress(0), 0, &None, no_vcpus).unwrap();
258255
}
259256

src/vmm/src/arch/x86_64/mptable.rs

Lines changed: 9 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -299,7 +299,8 @@ pub fn setup_mptable(mem: &GuestMemoryMmap, num_cpus: u8) -> Result<(), MptableE
299299
mod tests {
300300

301301
use super::*;
302-
use crate::vstate::memory::{Bytes, GuestMemoryExtension};
302+
use crate::utilities::test_utils::single_region_mem_at;
303+
use crate::vstate::memory::Bytes;
303304

304305
fn table_entry_size(type_: u8) -> usize {
305306
match u32::from(type_) {
@@ -315,35 +316,23 @@ mod tests {
315316
#[test]
316317
fn bounds_check() {
317318
let num_cpus = 4;
318-
let mem = GuestMemoryMmap::from_raw_regions(
319-
&[(GuestAddress(MPTABLE_START), compute_mp_size(num_cpus))],
320-
false,
321-
)
322-
.unwrap();
319+
let mem = single_region_mem_at(MPTABLE_START, compute_mp_size(num_cpus));
323320

324321
setup_mptable(&mem, num_cpus).unwrap();
325322
}
326323

327324
#[test]
328325
fn bounds_check_fails() {
329326
let num_cpus = 4;
330-
let mem = GuestMemoryMmap::from_raw_regions(
331-
&[(GuestAddress(MPTABLE_START), compute_mp_size(num_cpus) - 1)],
332-
false,
333-
)
334-
.unwrap();
327+
let mem = single_region_mem_at(MPTABLE_START, compute_mp_size(num_cpus) - 1);
335328

336329
setup_mptable(&mem, num_cpus).unwrap_err();
337330
}
338331

339332
#[test]
340333
fn mpf_intel_checksum() {
341334
let num_cpus = 1;
342-
let mem = GuestMemoryMmap::from_raw_regions(
343-
&[(GuestAddress(MPTABLE_START), compute_mp_size(num_cpus))],
344-
false,
345-
)
346-
.unwrap();
335+
let mem = single_region_mem_at(MPTABLE_START, compute_mp_size(num_cpus));
347336

348337
setup_mptable(&mem, num_cpus).unwrap();
349338

@@ -355,11 +344,7 @@ mod tests {
355344
#[test]
356345
fn mpc_table_checksum() {
357346
let num_cpus = 4;
358-
let mem = GuestMemoryMmap::from_raw_regions(
359-
&[(GuestAddress(MPTABLE_START), compute_mp_size(num_cpus))],
360-
false,
361-
)
362-
.unwrap();
347+
let mem = single_region_mem_at(MPTABLE_START, compute_mp_size(num_cpus));
363348

364349
setup_mptable(&mem, num_cpus).unwrap();
365350

@@ -381,11 +366,7 @@ mod tests {
381366
#[test]
382367
fn mpc_entry_count() {
383368
let num_cpus = 1;
384-
let mem = GuestMemoryMmap::from_raw_regions(
385-
&[(GuestAddress(MPTABLE_START), compute_mp_size(num_cpus))],
386-
false,
387-
)
388-
.unwrap();
369+
let mem = single_region_mem_at(MPTABLE_START, compute_mp_size(num_cpus));
389370

390371
setup_mptable(&mem, num_cpus).unwrap();
391372

@@ -413,14 +394,7 @@ mod tests {
413394

414395
#[test]
415396
fn cpu_entry_count() {
416-
let mem = GuestMemoryMmap::from_raw_regions(
417-
&[(
418-
GuestAddress(MPTABLE_START),
419-
compute_mp_size(MAX_SUPPORTED_CPUS),
420-
)],
421-
false,
422-
)
423-
.unwrap();
397+
let mem = single_region_mem_at(MPTABLE_START, compute_mp_size(MAX_SUPPORTED_CPUS));
424398

425399
for i in 0..MAX_SUPPORTED_CPUS {
426400
setup_mptable(&mem, i).unwrap();
@@ -451,11 +425,7 @@ mod tests {
451425
#[test]
452426
fn cpu_entry_count_max() {
453427
let cpus = MAX_SUPPORTED_CPUS + 1;
454-
let mem = GuestMemoryMmap::from_raw_regions(
455-
&[(GuestAddress(MPTABLE_START), compute_mp_size(cpus))],
456-
false,
457-
)
458-
.unwrap();
428+
let mem = single_region_mem_at(MPTABLE_START, compute_mp_size(cpus));
459429

460430
let result = setup_mptable(&mem, cpus).unwrap_err();
461431
assert_eq!(result, MptableError::TooManyCpus);

src/vmm/src/arch/x86_64/regs.rs

Lines changed: 15 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -238,17 +238,13 @@ fn setup_page_tables(mem: &GuestMemoryMmap, sregs: &mut kvm_sregs) -> Result<(),
238238

239239
#[cfg(test)]
240240
mod tests {
241+
#![allow(clippy::cast_possible_truncation)]
242+
241243
use kvm_ioctls::Kvm;
242-
use utils::u64_to_usize;
243244

244245
use super::*;
245-
use crate::vstate::memory::{Bytes, GuestAddress, GuestMemoryExtension, GuestMemoryMmap};
246-
247-
fn create_guest_mem(mem_size: Option<u64>) -> GuestMemoryMmap {
248-
let page_size = 0x10000usize;
249-
let mem_size = u64_to_usize(mem_size.unwrap_or(page_size as u64));
250-
GuestMemoryMmap::from_raw_regions(&[(GuestAddress(0), mem_size)], false).unwrap()
251-
}
246+
use crate::utilities::test_utils::single_region_mem;
247+
use crate::vstate::memory::{Bytes, GuestAddress, GuestMemoryMmap};
252248

253249
fn read_u64(gm: &GuestMemoryMmap, offset: u64) -> u64 {
254250
let read_addr = GuestAddress(offset);
@@ -335,7 +331,7 @@ mod tests {
335331
let kvm = Kvm::new().unwrap();
336332
let vm = kvm.create_vm().unwrap();
337333
let vcpu = vm.create_vcpu(0).unwrap();
338-
let gm = create_guest_mem(None);
334+
let gm = single_region_mem(0x10000);
339335

340336
vcpu.set_sregs(&Default::default()).unwrap();
341337
setup_sregs(&gm, &vcpu).unwrap();
@@ -352,7 +348,7 @@ mod tests {
352348
#[test]
353349
fn test_write_gdt_table() {
354350
// Not enough memory for the gdt table to be written.
355-
let gm = create_guest_mem(Some(BOOT_GDT_OFFSET));
351+
let gm = single_region_mem(BOOT_GDT_OFFSET as usize);
356352
let gdt_table: [u64; BOOT_GDT_MAX] = [
357353
gdt_entry(0, 0, 0), // NULL
358354
gdt_entry(0xa09b, 0, 0xfffff), // CODE
@@ -362,9 +358,8 @@ mod tests {
362358
write_gdt_table(&gdt_table, &gm).unwrap_err();
363359

364360
// We allocate exactly the amount needed to write four u64 to `BOOT_GDT_OFFSET`.
365-
let gm = create_guest_mem(Some(
366-
BOOT_GDT_OFFSET + (mem::size_of::<u64>() * BOOT_GDT_MAX) as u64,
367-
));
361+
let gm =
362+
single_region_mem(BOOT_GDT_OFFSET as usize + (mem::size_of::<u64>() * BOOT_GDT_MAX));
368363

369364
let gdt_table: [u64; BOOT_GDT_MAX] = [
370365
gdt_entry(0, 0, 0), // NULL
@@ -378,19 +373,19 @@ mod tests {
378373
#[test]
379374
fn test_write_idt_table() {
380375
// Not enough memory for the a u64 value to fit.
381-
let gm = create_guest_mem(Some(BOOT_IDT_OFFSET));
376+
let gm = single_region_mem(BOOT_IDT_OFFSET as usize);
382377
let val = 0x100;
383378
write_idt_value(val, &gm).unwrap_err();
384379

385-
let gm = create_guest_mem(Some(BOOT_IDT_OFFSET + mem::size_of::<u64>() as u64));
380+
let gm = single_region_mem(BOOT_IDT_OFFSET as usize + mem::size_of::<u64>());
386381
// We have allocated exactly the amount neded to write an u64 to `BOOT_IDT_OFFSET`.
387382
write_idt_value(val, &gm).unwrap();
388383
}
389384

390385
#[test]
391386
fn test_configure_segments_and_sregs() {
392387
let mut sregs: kvm_sregs = Default::default();
393-
let gm = create_guest_mem(None);
388+
let gm = single_region_mem(0x10000);
394389
configure_segments_and_sregs(&gm, &mut sregs).unwrap();
395390

396391
validate_segments_and_sregs(&gm, &sregs);
@@ -399,16 +394,16 @@ mod tests {
399394
#[test]
400395
fn test_setup_page_tables() {
401396
let mut sregs: kvm_sregs = Default::default();
402-
let gm = create_guest_mem(Some(PML4_START));
397+
let gm = single_region_mem(PML4_START as usize);
403398
setup_page_tables(&gm, &mut sregs).unwrap_err();
404399

405-
let gm = create_guest_mem(Some(PDPTE_START));
400+
let gm = single_region_mem(PDPTE_START as usize);
406401
setup_page_tables(&gm, &mut sregs).unwrap_err();
407402

408-
let gm = create_guest_mem(Some(PDE_START));
403+
let gm = single_region_mem(PDE_START as usize);
409404
setup_page_tables(&gm, &mut sregs).unwrap_err();
410405

411-
let gm = create_guest_mem(None);
406+
let gm = single_region_mem(0x10000);
412407
setup_page_tables(&gm, &mut sregs).unwrap();
413408

414409
validate_page_tables(&gm, &sregs);

0 commit comments

Comments
 (0)