@@ -70,6 +70,17 @@ pub enum Error {
7070 UnsortedMemoryRegions ,
7171}
7272
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+
7384impl fmt:: Display for Error {
7485 fn fmt ( & self , f : & mut fmt:: Formatter ) -> fmt:: Result {
7586 match self {
@@ -426,16 +437,44 @@ impl GuestMemoryMmap {
426437 ///
427438 /// Valid memory regions are specified as a slice of (Address, Size) tuples sorted by Address.
428439 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+ )
430469 }
431470
432471 /// Creates a container and allocates anonymous memory for guest memory regions.
433472 ///
434473 /// Valid memory regions are specified as a sequence of (Address, Size, Option<FileOffset>)
435474 /// 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 >
437476 where
438- A : Borrow < ( GuestAddress , usize , Option < FileOffset > ) > ,
477+ A : Borrow < ( GuestAddress , usize , PageSizePolicy , Option < FileOffset > ) > ,
439478 T : IntoIterator < Item = A > ,
440479 {
441480 Self :: from_regions (
@@ -444,11 +483,12 @@ impl GuestMemoryMmap {
444483 . map ( |x| {
445484 let guest_base = x. borrow ( ) . 0 ;
446485 let size = x. borrow ( ) . 1 ;
486+ let policy = x. borrow ( ) . 2 ;
447487
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 )
450490 } else {
451- MmapRegion :: new ( size)
491+ MmapRegion :: new ( size, policy )
452492 }
453493 . map_err ( Error :: MmapRegion )
454494 . and_then ( |r| GuestRegionMmap :: new ( r, guest_base) )
0 commit comments