Skip to content

Commit 5f59e29

Browse files
committed
guest_memory: let multiple regions slice one global bitmap
QEMU uses a global bitmap, with each RAM region using an offset into it. This could be easily represented if bitmap() returned a BaseSlice<&'static GlobalBitmap>, but there is a problem: bitmap() currently wants to return a reference to the bitmap! So change it to always return a slice. This is more flexible, and it isn't a performance problem because BitmapSlices are meant to be cheap wrappers around a reference or Arc<> Signed-off-by: Paolo Bonzini <[email protected]>
1 parent 3f2fd80 commit 5f59e29

File tree

3 files changed

+9
-9
lines changed

3 files changed

+9
-9
lines changed

src/bitmap/mod.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -293,13 +293,13 @@ pub(crate) mod tests {
293293

294294
let slice = region.get_slice(dirty_addr, dirty_len).unwrap();
295295

296-
assert!(range_is_clean(region.bitmap(), 0, region.len() as usize));
296+
assert!(range_is_clean(&region.bitmap(), 0, region.len() as usize));
297297
assert!(range_is_clean(slice.bitmap(), 0, dirty_len));
298298

299299
region.write_obj(val, dirty_addr).unwrap();
300300

301301
assert!(range_is_dirty(
302-
region.bitmap(),
302+
&region.bitmap(),
303303
dirty_addr.0 as usize,
304304
dirty_len
305305
));
@@ -312,7 +312,7 @@ pub(crate) mod tests {
312312
test_bytes(
313313
region,
314314
|r: &R, start: usize, len: usize, clean: bool| {
315-
check_range(r.bitmap(), start, len, clean)
315+
check_range(&r.bitmap(), start, len, clean)
316316
},
317317
|offset| MemoryRegionAddress(offset as u64),
318318
0x1000,
@@ -334,13 +334,13 @@ pub(crate) mod tests {
334334
let (region, region_addr) = m.to_region_addr(dirty_addr).unwrap();
335335
let slice = m.get_slice(dirty_addr, dirty_len).unwrap();
336336

337-
assert!(range_is_clean(region.bitmap(), 0, region.len() as usize));
337+
assert!(range_is_clean(&region.bitmap(), 0, region.len() as usize));
338338
assert!(range_is_clean(slice.bitmap(), 0, dirty_len));
339339

340340
m.write_obj(val, dirty_addr).unwrap();
341341

342342
assert!(range_is_dirty(
343-
region.bitmap(),
343+
&region.bitmap(),
344344
region_addr.0 as usize,
345345
dirty_len
346346
));
@@ -354,7 +354,7 @@ pub(crate) mod tests {
354354
let check_range_closure = |m: &M, start: usize, len: usize, clean: bool| -> bool {
355355
let mut check_result = true;
356356
m.try_access(len, GuestAddress(start as u64), |_, size, reg_addr, reg| {
357-
if !check_range(reg.bitmap(), reg_addr.0 as usize, size, clean) {
357+
if !check_range(&reg.bitmap(), reg_addr.0 as usize, size, clean) {
358358
check_result = false;
359359
}
360360
Ok(size)

src/guest_memory.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -177,7 +177,7 @@ pub trait GuestMemoryRegion: Bytes<MemoryRegionAddress, E = Error> {
177177
}
178178

179179
/// Borrow the associated `Bitmap` object.
180-
fn bitmap(&self) -> &Self::B;
180+
fn bitmap(&self) -> BS<'_, Self::B>;
181181

182182
/// Returns the given address if it is within this region.
183183
fn check_address(&self, addr: MemoryRegionAddress) -> Option<MemoryRegionAddress> {

src/mmap/mod.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -327,8 +327,8 @@ impl<B: Bitmap> GuestMemoryRegion for GuestRegionMmap<B> {
327327
self.guest_base
328328
}
329329

330-
fn bitmap(&self) -> &Self::B {
331-
self.mapping.bitmap()
330+
fn bitmap(&self) -> BS<'_, Self::B> {
331+
self.mapping.bitmap().slice_at(0)
332332
}
333333

334334
fn get_host_address(&self, addr: MemoryRegionAddress) -> guest_memory::Result<*mut u8> {

0 commit comments

Comments
 (0)