@@ -70,6 +70,17 @@ pub enum Error {
70
70
UnsortedMemoryRegions ,
71
71
}
72
72
73
+ /// Page configuration types for controlling allocation size and behavior
74
+ #[ derive( Debug , Copy , Clone , PartialEq ) ]
75
+ pub enum PageSizePolicy {
76
+ /// Base pages are the smallest page-size unit available on the system.
77
+ BasePages ,
78
+ /// Transparent hugepages, if available, are managed by the host operating system.
79
+ TransparentHugepages ,
80
+ /// Explicit hugepages swear a lot. Especially if the addresses aren't aligned.
81
+ ExplicitHugepages ,
82
+ }
83
+
73
84
impl fmt:: Display for Error {
74
85
fn fmt ( & self , f : & mut fmt:: Formatter ) -> fmt:: Result {
75
86
match self {
@@ -426,16 +437,44 @@ impl GuestMemoryMmap {
426
437
///
427
438
/// Valid memory regions are specified as a slice of (Address, Size) tuples sorted by Address.
428
439
pub fn from_ranges ( ranges : & [ ( GuestAddress , usize ) ] ) -> result:: Result < Self , Error > {
429
- Self :: from_ranges_with_files ( ranges. iter ( ) . map ( |r| ( r. 0 , r. 1 , None ) ) )
440
+ Self :: from_ranges_with_options (
441
+ ranges
442
+ . iter ( )
443
+ . map ( |r| ( r. 0 , r. 1 , PageSizePolicy :: BasePages , None ) ) ,
444
+ )
445
+ }
446
+
447
+ /// Creates a container and allocates anonymous memory for guest memory regions.
448
+ ///
449
+ /// Valid memory regions are specified as asequence of (Address, Size, PageSizePolicy)
450
+ /// tuples sorted by Address.
451
+ pub fn from_ranges_with_policy (
452
+ ranges : & [ ( GuestAddress , usize , PageSizePolicy ) ] ,
453
+ ) -> result:: Result < Self , Error > {
454
+ Self :: from_ranges_with_options ( ranges. iter ( ) . map ( |r| ( r. 0 , r. 1 , r. 2 , None ) ) )
455
+ }
456
+
457
+ /// Creates a container and allocates anonymous memory for guest memory regions.
458
+ ///
459
+ /// Valid memory regions are specified as a sequence of (Address, Size, Option<FileOffset>)
460
+ /// tuples sorted by Address.
461
+ pub fn from_ranges_with_files < A , T > (
462
+ ranges : & [ ( GuestAddress , usize , Option < FileOffset > ) ] ,
463
+ ) -> result:: Result < Self , Error > {
464
+ Self :: from_ranges_with_options (
465
+ ranges
466
+ . iter ( )
467
+ . map ( |r| ( r. 0 , r. 1 , PageSizePolicy :: BasePages , r. 2 . clone ( ) ) ) ,
468
+ )
430
469
}
431
470
432
471
/// Creates a container and allocates anonymous memory for guest memory regions.
433
472
///
434
473
/// Valid memory regions are specified as a sequence of (Address, Size, Option<FileOffset>)
435
474
/// tuples sorted by Address.
436
- pub fn from_ranges_with_files < A , T > ( ranges : T ) -> result:: Result < Self , Error >
475
+ pub fn from_ranges_with_options < A , T > ( ranges : T ) -> result:: Result < Self , Error >
437
476
where
438
- A : Borrow < ( GuestAddress , usize , Option < FileOffset > ) > ,
477
+ A : Borrow < ( GuestAddress , usize , PageSizePolicy , Option < FileOffset > ) > ,
439
478
T : IntoIterator < Item = A > ,
440
479
{
441
480
Self :: from_regions (
@@ -444,11 +483,12 @@ impl GuestMemoryMmap {
444
483
. map ( |x| {
445
484
let guest_base = x. borrow ( ) . 0 ;
446
485
let size = x. borrow ( ) . 1 ;
486
+ let policy = x. borrow ( ) . 2 ;
447
487
448
- if let Some ( ref f_off) = x. borrow ( ) . 2 {
449
- MmapRegion :: from_file ( f_off. clone ( ) , size)
488
+ if let Some ( ref f_off) = x. borrow ( ) . 3 {
489
+ MmapRegion :: from_file ( f_off. clone ( ) , size, policy )
450
490
} else {
451
- MmapRegion :: new ( size)
491
+ MmapRegion :: new ( size, policy )
452
492
}
453
493
. map_err ( Error :: MmapRegion )
454
494
. and_then ( |r| GuestRegionMmap :: new ( r, guest_base) )
0 commit comments