Skip to content

Commit 1e1378a

Browse files
committed
test(memory): add proptest for store_dirty_bitmap
Apply the proptest also to store_dirty_bitmap. Signed-off-by: Riccardo Mancini <mancio@amazon.com>
1 parent 2d11531 commit 1e1378a

1 file changed

Lines changed: 31 additions & 0 deletions

File tree

src/vmm/src/vstate/memory.rs

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1715,6 +1715,37 @@ mod tests {
17151715
oracle_file.read_exact(&mut oracle_buf).unwrap();
17161716
prop_assert_eq!(&opt_buf, &oracle_buf);
17171717
}
1718+
1719+
#[test]
1720+
fn store_dirty_bitmap_correctness(
1721+
region_specs in proptest::collection::vec(region_spec(), 1..=3),
1722+
) {
1723+
let page_size = get_page_size().unwrap();
1724+
let (guest_memory, kvm_bitmap, _) = build_memory(&region_specs);
1725+
1726+
guest_memory.store_dirty_bitmap(&kvm_bitmap, page_size);
1727+
1728+
// Verify: every KVM-dirty page on a plugged slot is now
1729+
// dirty in the firecracker bitmap.
1730+
for (region, spec) in guest_memory.iter().zip(region_specs.iter()) {
1731+
for (slot_idx, (slot, plugged)) in region.slots().enumerate() {
1732+
if !plugged {
1733+
continue;
1734+
}
1735+
let num_pages = slot.slice.len() / page_size;
1736+
let bm = &spec.kvm_bitmaps[slot_idx];
1737+
let fc = slot.slice.bitmap();
1738+
for page in 0..num_pages {
1739+
let kvm_dirty =
1740+
((bm[page / 64] >> (page % 64)) & 1) == 1;
1741+
let fc_dirty = fc.dirty_at(page * page_size);
1742+
// Bitmap starts clean, so after store_dirty_bitmap
1743+
// the fc bitmap must exactly match the KVM bitmap.
1744+
prop_assert_eq!(fc_dirty, kvm_dirty, "mismatch at page {}", page);
1745+
}
1746+
}
1747+
}
1748+
}
17181749
}
17191750
}
17201751
}

0 commit comments

Comments
 (0)