Skip to content

Commit c01fb7b

Browse files
committed
feat(memory): added FileOffset to the MmapRegions
Now when memory is backed by the file we store `FileOffset` inside each region. This information will be used to set up vhost-user shared memory. Signed-off-by: Egor Lazarchuk <[email protected]>
1 parent 6121b6c commit c01fb7b

File tree

1 file changed

+23
-18
lines changed

1 file changed

+23
-18
lines changed

src/vmm/src/vstate/memory.rs

Lines changed: 23 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ where
8181

8282
/// Creates a GuestMemoryMmap from raw regions with guard pages.
8383
fn from_raw_regions_file(
84-
regions: &[(FileOffset, GuestAddress, usize)],
84+
regions: Vec<(FileOffset, GuestAddress, usize)>,
8585
track_dirty_pages: bool,
8686
shared: bool,
8787
) -> Result<Self, MemoryError>;
@@ -150,7 +150,7 @@ impl GuestMemoryExtension for GuestMemoryMmap {
150150
})
151151
.collect::<Result<Vec<_>, MemoryError>>()?;
152152

153-
Self::from_raw_regions_file(&regions, track_dirty_pages, true)
153+
Self::from_raw_regions_file(regions, track_dirty_pages, true)
154154
}
155155

156156
/// Creates a GuestMemoryMmap with `size` in MiB and guard pages backed by anonymous memory.
@@ -210,7 +210,7 @@ impl GuestMemoryExtension for GuestMemoryMmap {
210210

211211
/// Creates a GuestMemoryMmap from raw regions with guard pages backed by file.
212212
fn from_raw_regions_file(
213-
regions: &[(FileOffset, GuestAddress, usize)],
213+
regions: Vec<(FileOffset, GuestAddress, usize)>,
214214
track_dirty_pages: bool,
215215
shared: bool,
216216
) -> Result<Self, MemoryError> {
@@ -221,16 +221,16 @@ impl GuestMemoryExtension for GuestMemoryMmap {
221221
libc::MAP_NORESERVE | libc::MAP_PRIVATE
222222
};
223223
let regions = regions
224-
.iter()
224+
.into_iter()
225225
.map(|(file_offset, guest_address, region_size)| {
226226
let region = build_guarded_region(
227227
Some(file_offset),
228-
*region_size,
228+
region_size,
229229
prot,
230230
flags,
231231
track_dirty_pages,
232232
)?;
233-
GuestRegionMmap::new(region, *guest_address).map_err(MemoryError::VmMemoryError)
233+
GuestRegionMmap::new(region, guest_address).map_err(MemoryError::VmMemoryError)
234234
})
235235
.collect::<Result<Vec<_>, MemoryError>>()?;
236236

@@ -258,7 +258,7 @@ impl GuestMemoryExtension for GuestMemoryMmap {
258258
.collect::<Result<Vec<_>, std::io::Error>>()
259259
.map_err(MemoryError::FileError)?;
260260

261-
Self::from_raw_regions_file(&regions, track_dirty_pages, false)
261+
Self::from_raw_regions_file(regions, track_dirty_pages, false)
262262
}
263263
None => {
264264
let regions = state
@@ -407,7 +407,7 @@ pub fn create_memfd(size: usize) -> Result<memfd::Memfd, MemoryError> {
407407
/// acts as a safety net for accessing out-of-bounds addresses that are not allocated for the
408408
/// guest's memory.
409409
fn build_guarded_region(
410-
file_offset: Option<&FileOffset>,
410+
file_offset: Option<FileOffset>,
411411
size: usize,
412412
prot: i32,
413413
flags: i32,
@@ -438,7 +438,7 @@ fn build_guarded_region(
438438
}
439439

440440
let (fd, offset) = match file_offset {
441-
Some(file_offset) => {
441+
Some(ref file_offset) => {
442442
check_file_offset(file_offset, size).map_err(MemoryError::MmapRegionError)?;
443443
(file_offset.file().as_raw_fd(), file_offset.start())
444444
}
@@ -473,14 +473,19 @@ fn build_guarded_region(
473473
};
474474

475475
// SAFETY: Safe because the parameters are valid.
476-
unsafe {
476+
let builder = unsafe {
477477
MmapRegionBuilder::new_with_bitmap(size, bitmap)
478478
.with_raw_mmap_pointer(region_addr.cast::<u8>())
479479
.with_mmap_prot(prot)
480480
.with_mmap_flags(flags)
481-
.build()
482-
.map_err(MemoryError::MmapRegionError)
481+
};
482+
483+
match file_offset {
484+
Some(offset) => builder.with_file_offset(offset),
485+
None => builder,
483486
}
487+
.build()
488+
.map_err(MemoryError::MmapRegionError)
484489
}
485490

486491
#[cfg(test)]
@@ -608,11 +613,11 @@ mod tests {
608613
let file_offset = FileOffset::new(file, 0);
609614

610615
let region =
611-
build_guarded_region(Some(&file_offset), region_size, prot, flags, false).unwrap();
616+
build_guarded_region(Some(file_offset), region_size, prot, flags, false).unwrap();
612617

613618
// Verify that the region was built correctly
614619
assert_eq!(region.size(), region_size);
615-
assert!(region.file_offset().is_none());
620+
assert!(region.file_offset().is_some());
616621
assert_eq!(region.prot(), prot);
617622
assert_eq!(region.flags(), flags);
618623

@@ -742,10 +747,10 @@ mod tests {
742747
// Test that all regions are guarded.
743748
{
744749
let guest_memory =
745-
GuestMemoryMmap::from_raw_regions_file(&regions, false, false).unwrap();
750+
GuestMemoryMmap::from_raw_regions_file(regions.clone(), false, false).unwrap();
746751
guest_memory.iter().for_each(|region| {
747752
assert_eq!(region.size(), region_size);
748-
assert!(region.file_offset().is_none());
753+
assert!(region.file_offset().is_some());
749754
assert!(region.bitmap().is_none());
750755
validate_guard_region(region);
751756
});
@@ -754,7 +759,7 @@ mod tests {
754759
// Check dirty page tracking is off.
755760
{
756761
let guest_memory =
757-
GuestMemoryMmap::from_raw_regions_file(&regions, false, false).unwrap();
762+
GuestMemoryMmap::from_raw_regions_file(regions.clone(), false, false).unwrap();
758763
guest_memory.iter().for_each(|region| {
759764
assert!(region.bitmap().is_none());
760765
});
@@ -763,7 +768,7 @@ mod tests {
763768
// Check dirty page tracking is on.
764769
{
765770
let guest_memory =
766-
GuestMemoryMmap::from_raw_regions_file(&regions, true, false).unwrap();
771+
GuestMemoryMmap::from_raw_regions_file(regions, true, false).unwrap();
767772
guest_memory.iter().for_each(|region| {
768773
assert!(region.bitmap().is_some());
769774
});

0 commit comments

Comments
 (0)