Skip to content

Commit 1696fa6

Browse files
vireshkjiangliu
authored andcommitted
mmap: Add GuestRegionMmap::from_region()
All call sites are doing similar work currently, i.e. creating a MmapRegion and then passing it to GuestRegionMmap::new(). Add another variant to GuestRegionMmap, to create the structure from raw data. Signed-off-by: Viresh Kumar <[email protected]>
1 parent 2649dc8 commit 1696fa6

File tree

2 files changed

+36
-41
lines changed

2 files changed

+36
-41
lines changed

coverage_config_x86_64.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
{
2-
"coverage_score": 87.8,
2+
"coverage_score": 87.1,
33
"exclude_path": "mmap_windows.rs",
44
"crate_features": "backend-mmap,backend-atomic,backend-bitmap"
55
}

src/mmap.rs

Lines changed: 35 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -170,6 +170,24 @@ impl<B: Bitmap> GuestRegionMmap<B> {
170170
}
171171
}
172172

173+
impl<B: NewBitmap> GuestRegionMmap<B> {
174+
/// Create a new memory-mapped memory region from guest's physical memory, size and file.
175+
pub fn from_range(
176+
addr: GuestAddress,
177+
size: usize,
178+
file: Option<FileOffset>,
179+
) -> result::Result<Self, Error> {
180+
let region = if let Some(ref f_off) = file {
181+
MmapRegion::from_file(f_off.clone(), size)
182+
} else {
183+
MmapRegion::new(size)
184+
}
185+
.map_err(Error::MmapRegion)?;
186+
187+
Self::new(region, addr)
188+
}
189+
}
190+
173191
impl<B: Bitmap> Bytes<MemoryRegionAddress> for GuestRegionMmap<B> {
174192
type E = guest_memory::Error;
175193

@@ -529,16 +547,7 @@ impl<B: NewBitmap> GuestMemoryMmap<B> {
529547
ranges
530548
.into_iter()
531549
.map(|x| {
532-
let guest_base = x.borrow().0;
533-
let size = x.borrow().1;
534-
535-
if let Some(ref f_off) = x.borrow().2 {
536-
MmapRegion::from_file(f_off.clone(), size)
537-
} else {
538-
MmapRegion::new(size)
539-
}
540-
.map_err(Error::MmapRegion)
541-
.and_then(|r| GuestRegionMmap::new(r, guest_base))
550+
GuestRegionMmap::from_range(x.borrow().0, x.borrow().1, x.borrow().2.clone())
542551
})
543552
.collect::<result::Result<Vec<_>, Error>>()?,
544553
)
@@ -734,8 +743,7 @@ mod tests {
734743
regions_summary
735744
.iter()
736745
.map(|(region_addr, region_size)| {
737-
GuestRegionMmap::new(MmapRegion::new(*region_size).unwrap(), *region_addr)
738-
.unwrap()
746+
GuestRegionMmap::from_range(*region_addr, *region_size, None).unwrap()
739747
})
740748
.collect(),
741749
)
@@ -748,10 +756,7 @@ mod tests {
748756
regions_summary
749757
.iter()
750758
.map(|(region_addr, region_size)| {
751-
Arc::new(
752-
GuestRegionMmap::new(MmapRegion::new(*region_size).unwrap(), *region_addr)
753-
.unwrap(),
754-
)
759+
Arc::new(GuestRegionMmap::from_range(*region_addr, *region_size, None).unwrap())
755760
})
756761
.collect(),
757762
)
@@ -929,7 +934,7 @@ mod tests {
929934

930935
#[test]
931936
fn slice_addr() {
932-
let m = GuestRegionMmap::new(MmapRegion::new(5).unwrap(), GuestAddress(0)).unwrap();
937+
let m = GuestRegionMmap::from_range(GuestAddress(0), 5, None).unwrap();
933938
let s = m.get_slice(MemoryRegionAddress(2), 3).unwrap();
934939
assert_eq!(s.as_ptr(), unsafe { m.as_ptr().offset(2) });
935940
}
@@ -940,8 +945,8 @@ mod tests {
940945
let sample_buf = &[1, 2, 3, 4, 5];
941946
assert!(f.write_all(sample_buf).is_ok());
942947

943-
let region = MmapRegion::from_file(FileOffset::new(f, 0), sample_buf.len()).unwrap();
944-
let mem_map = GuestRegionMmap::new(region, GuestAddress(0)).unwrap();
948+
let file = Some(FileOffset::new(f, 0));
949+
let mem_map = GuestRegionMmap::from_range(GuestAddress(0), sample_buf.len(), file).unwrap();
945950
let buf = &mut [0u8; 16];
946951
assert_eq!(
947952
mem_map.as_volatile_slice().unwrap().read(buf, 0).unwrap(),
@@ -1365,21 +1370,17 @@ mod tests {
13651370
let mem_orig = gm.memory();
13661371
assert_eq!(mem_orig.num_regions(), 2);
13671372

1368-
let mmap = Arc::new(
1369-
GuestRegionMmap::new(MmapRegion::new(0x1000).unwrap(), GuestAddress(0x8000)).unwrap(),
1370-
);
1373+
let mmap =
1374+
Arc::new(GuestRegionMmap::from_range(GuestAddress(0x8000), 0x1000, None).unwrap());
13711375
let gm = gm.insert_region(mmap).unwrap();
1372-
let mmap = Arc::new(
1373-
GuestRegionMmap::new(MmapRegion::new(0x1000).unwrap(), GuestAddress(0x4000)).unwrap(),
1374-
);
1376+
let mmap =
1377+
Arc::new(GuestRegionMmap::from_range(GuestAddress(0x4000), 0x1000, None).unwrap());
13751378
let gm = gm.insert_region(mmap).unwrap();
1376-
let mmap = Arc::new(
1377-
GuestRegionMmap::new(MmapRegion::new(0x1000).unwrap(), GuestAddress(0xc000)).unwrap(),
1378-
);
1379+
let mmap =
1380+
Arc::new(GuestRegionMmap::from_range(GuestAddress(0xc000), 0x1000, None).unwrap());
13791381
let gm = gm.insert_region(mmap).unwrap();
1380-
let mmap = Arc::new(
1381-
GuestRegionMmap::new(MmapRegion::new(0x1000).unwrap(), GuestAddress(0xc000)).unwrap(),
1382-
);
1382+
let mmap =
1383+
Arc::new(GuestRegionMmap::from_range(GuestAddress(0xc000), 0x1000, None).unwrap());
13831384
gm.insert_region(mmap).unwrap_err();
13841385

13851386
assert_eq!(mem_orig.num_regions(), 2);
@@ -1416,10 +1417,7 @@ mod tests {
14161417

14171418
#[test]
14181419
fn test_guest_memory_mmap_get_slice() {
1419-
let region_addr = GuestAddress(0);
1420-
let region_size = 0x400;
1421-
let region =
1422-
GuestRegionMmap::new(MmapRegion::new(region_size).unwrap(), region_addr).unwrap();
1420+
let region = GuestRegionMmap::from_range(GuestAddress(0), 0x400, None).unwrap();
14231421

14241422
// Normal case.
14251423
let slice_addr = MemoryRegionAddress(0x100);
@@ -1441,10 +1439,8 @@ mod tests {
14411439

14421440
#[test]
14431441
fn test_guest_memory_mmap_as_volatile_slice() {
1444-
let region_addr = GuestAddress(0);
14451442
let region_size = 0x400;
1446-
let region =
1447-
GuestRegionMmap::new(MmapRegion::new(region_size).unwrap(), region_addr).unwrap();
1443+
let region = GuestRegionMmap::from_range(GuestAddress(0), region_size, None).unwrap();
14481444

14491445
// Test slice length.
14501446
let slice = region.as_volatile_slice().unwrap();
@@ -1548,8 +1544,7 @@ mod tests {
15481544

15491545
#[test]
15501546
fn test_atomic_accesses() {
1551-
let region =
1552-
GuestRegionMmap::new(MmapRegion::new(0x1000).unwrap(), GuestAddress(0)).unwrap();
1547+
let region = GuestRegionMmap::from_range(GuestAddress(0), 0x1000, None).unwrap();
15531548

15541549
crate::bytes::tests::check_atomic_accesses(
15551550
region,

0 commit comments

Comments
 (0)