81
81
82
82
/// Creates a GuestMemoryMmap from raw regions with guard pages.
83
83
fn from_raw_regions_file (
84
- regions : & [ ( FileOffset , GuestAddress , usize ) ] ,
84
+ regions : Vec < ( FileOffset , GuestAddress , usize ) > ,
85
85
track_dirty_pages : bool ,
86
86
shared : bool ,
87
87
) -> Result < Self , MemoryError > ;
@@ -150,7 +150,7 @@ impl GuestMemoryExtension for GuestMemoryMmap {
150
150
} )
151
151
. collect :: < Result < Vec < _ > , MemoryError > > ( ) ?;
152
152
153
- Self :: from_raw_regions_file ( & regions, track_dirty_pages, true )
153
+ Self :: from_raw_regions_file ( regions, track_dirty_pages, true )
154
154
}
155
155
156
156
/// Creates a GuestMemoryMmap with `size` in MiB and guard pages backed by anonymous memory.
@@ -210,7 +210,7 @@ impl GuestMemoryExtension for GuestMemoryMmap {
210
210
211
211
/// Creates a GuestMemoryMmap from raw regions with guard pages backed by file.
212
212
fn from_raw_regions_file (
213
- regions : & [ ( FileOffset , GuestAddress , usize ) ] ,
213
+ regions : Vec < ( FileOffset , GuestAddress , usize ) > ,
214
214
track_dirty_pages : bool ,
215
215
shared : bool ,
216
216
) -> Result < Self , MemoryError > {
@@ -221,16 +221,16 @@ impl GuestMemoryExtension for GuestMemoryMmap {
221
221
libc:: MAP_NORESERVE | libc:: MAP_PRIVATE
222
222
} ;
223
223
let regions = regions
224
- . iter ( )
224
+ . into_iter ( )
225
225
. map ( |( file_offset, guest_address, region_size) | {
226
226
let region = build_guarded_region (
227
227
Some ( file_offset) ,
228
- * region_size,
228
+ region_size,
229
229
prot,
230
230
flags,
231
231
track_dirty_pages,
232
232
) ?;
233
- GuestRegionMmap :: new ( region, * guest_address) . map_err ( MemoryError :: VmMemoryError )
233
+ GuestRegionMmap :: new ( region, guest_address) . map_err ( MemoryError :: VmMemoryError )
234
234
} )
235
235
. collect :: < Result < Vec < _ > , MemoryError > > ( ) ?;
236
236
@@ -258,7 +258,7 @@ impl GuestMemoryExtension for GuestMemoryMmap {
258
258
. collect :: < Result < Vec < _ > , std:: io:: Error > > ( )
259
259
. map_err ( MemoryError :: FileError ) ?;
260
260
261
- Self :: from_raw_regions_file ( & regions, track_dirty_pages, false )
261
+ Self :: from_raw_regions_file ( regions, track_dirty_pages, false )
262
262
}
263
263
None => {
264
264
let regions = state
@@ -407,7 +407,7 @@ pub fn create_memfd(size: usize) -> Result<memfd::Memfd, MemoryError> {
407
407
/// acts as a safety net for accessing out-of-bounds addresses that are not allocated for the
408
408
/// guest's memory.
409
409
fn build_guarded_region (
410
- file_offset : Option < & FileOffset > ,
410
+ file_offset : Option < FileOffset > ,
411
411
size : usize ,
412
412
prot : i32 ,
413
413
flags : i32 ,
@@ -438,7 +438,7 @@ fn build_guarded_region(
438
438
}
439
439
440
440
let ( fd, offset) = match file_offset {
441
- Some ( file_offset) => {
441
+ Some ( ref file_offset) => {
442
442
check_file_offset ( file_offset, size) . map_err ( MemoryError :: MmapRegionError ) ?;
443
443
( file_offset. file ( ) . as_raw_fd ( ) , file_offset. start ( ) )
444
444
}
@@ -473,14 +473,19 @@ fn build_guarded_region(
473
473
} ;
474
474
475
475
// SAFETY: Safe because the parameters are valid.
476
- unsafe {
476
+ let builder = unsafe {
477
477
MmapRegionBuilder :: new_with_bitmap ( size, bitmap)
478
478
. with_raw_mmap_pointer ( region_addr. cast :: < u8 > ( ) )
479
479
. with_mmap_prot ( prot)
480
480
. 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,
483
486
}
487
+ . build ( )
488
+ . map_err ( MemoryError :: MmapRegionError )
484
489
}
485
490
486
491
#[ cfg( test) ]
@@ -545,11 +550,11 @@ mod tests {
545
550
let file_offset = FileOffset :: new ( file, 0 ) ;
546
551
547
552
let region =
548
- build_guarded_region ( Some ( & file_offset) , region_size, prot, flags, false ) . unwrap ( ) ;
553
+ build_guarded_region ( Some ( file_offset) , region_size, prot, flags, false ) . unwrap ( ) ;
549
554
550
555
// Verify that the region was built correctly
551
556
assert_eq ! ( region. size( ) , region_size) ;
552
- assert ! ( region. file_offset( ) . is_none ( ) ) ;
557
+ assert ! ( region. file_offset( ) . is_some ( ) ) ;
553
558
assert_eq ! ( region. prot( ) , prot) ;
554
559
assert_eq ! ( region. flags( ) , flags) ;
555
560
@@ -677,10 +682,10 @@ mod tests {
677
682
// Test that all regions are guarded.
678
683
{
679
684
let guest_memory =
680
- GuestMemoryMmap :: from_raw_regions_file ( & regions, false , false ) . unwrap ( ) ;
685
+ GuestMemoryMmap :: from_raw_regions_file ( regions. clone ( ) , false , false ) . unwrap ( ) ;
681
686
guest_memory. iter ( ) . for_each ( |region| {
682
687
assert_eq ! ( region. size( ) , region_size) ;
683
- assert ! ( region. file_offset( ) . is_none ( ) ) ;
688
+ assert ! ( region. file_offset( ) . is_some ( ) ) ;
684
689
assert ! ( region. bitmap( ) . is_none( ) ) ;
685
690
validate_guard_region ( region) ;
686
691
} ) ;
@@ -689,7 +694,7 @@ mod tests {
689
694
// Check dirty page tracking is off.
690
695
{
691
696
let guest_memory =
692
- GuestMemoryMmap :: from_raw_regions_file ( & regions, false , false ) . unwrap ( ) ;
697
+ GuestMemoryMmap :: from_raw_regions_file ( regions. clone ( ) , false , false ) . unwrap ( ) ;
693
698
guest_memory. iter ( ) . for_each ( |region| {
694
699
assert ! ( region. bitmap( ) . is_none( ) ) ;
695
700
} ) ;
@@ -698,7 +703,7 @@ mod tests {
698
703
// Check dirty page tracking is on.
699
704
{
700
705
let guest_memory =
701
- GuestMemoryMmap :: from_raw_regions_file ( & regions, true , false ) . unwrap ( ) ;
706
+ GuestMemoryMmap :: from_raw_regions_file ( regions, true , false ) . unwrap ( ) ;
702
707
guest_memory. iter ( ) . for_each ( |region| {
703
708
assert ! ( region. bitmap( ) . is_some( ) ) ;
704
709
} ) ;
0 commit comments