#[derive(Debug, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, Hash)]
pub struct PageSizeOrHugePageSizeSettings
{
mmap_flag_bits: i32,
memfd_flag_bits: i32,
page_size_or_huge_page_size: PageSizeOrHugePageSize,
}
impl PageSizeOrHugePageSizeSettings
{
const MFD_HUGETLB: i32 = 0x0004;
#[inline(always)]
pub fn is_using_huge_pages(&self) -> bool
{
matches!(self.page_size_or_huge_page_size, PageSizeOrHugePageSize::HugePageSize(_))
}
pub const fn page_size_or_huge_page_size(&self) -> PageSizeOrHugePageSize
{
self.page_size_or_huge_page_size
}
pub(crate) const fn mmap_flag_bits_and_page_size(&self) -> (i32, PageSizeOrHugePageSize)
{
(self.mmap_flag_bits, self.page_size_or_huge_page_size)
}
pub(crate) const fn memfd_flag_bits_and_page_size(&self) -> (i32, PageSizeOrHugePageSize)
{
(self.memfd_flag_bits, self.page_size_or_huge_page_size)
}
#[cfg(any(target_arch = "powerpc64", target_arch = "riscv64", target_arch = "sparc64", target_arch = "x86_64"))]
pub const fn for_default_page_size() -> Self
{
Self::for_page_size(PageSize::default())
}
#[cfg(not(any(target_arch = "powerpc64", target_arch = "riscv64", target_arch = "sparc64", target_arch = "x86_64")))]
#[inline(always)]
pub fn for_default_page_size() -> Self
{
Self::for_page_size(PageSize::default())
}
const fn for_page_size(page_size: PageSize) -> Self
{
Self::new(0, 0, PageSizeOrHugePageSize::PageSize(page_size))
}
#[inline(always)]
pub fn for_huge_page_size(huge_page_size: HugePageSize) -> Self
{
let mmap_and_memfd_flags_bits = huge_page_size.mmap_and_memfd_flags_bits();
Self::new(MAP_HUGETLB | mmap_and_memfd_flags_bits, Self::MFD_HUGETLB | mmap_and_memfd_flags_bits, PageSizeOrHugePageSize::HugePageSize(huge_page_size))
}
#[inline(always)]
fn for_default_huge_page_size(default_huge_page_size: HugePageSize) -> Self
{
Self::new(MAP_HUGETLB, Self::MFD_HUGETLB, PageSizeOrHugePageSize::HugePageSize(default_huge_page_size))
}
#[inline(always)]
pub fn from(page_size_preference: PageSizePreference, defaults: &DefaultHugePageSizes) -> Self
{
use self::PageSizePreference::*;
match page_size_preference
{
DefaultPageSize => Self::for_default_page_size(),
DefaultHugePageSize => match defaults.default_huge_page_size()
{
Some(default_huge_page_size) => Self::for_default_huge_page_size(default_huge_page_size),
None => Self::for_default_page_size()
},
PreferredHugePageSize(huge_page_size) => match defaults.this_or_next_smaller_supported_huge_page_size(huge_page_size)
{
Some(huge_page_size) => Self::for_huge_page_size(huge_page_size),
None => Self::for_default_page_size()
},
}
}
const fn new(mmmap_flag_bits: i32, memfd_flag_bits: i32, page_size_or_huge_page_size: PageSizeOrHugePageSize) -> Self
{
Self
{
mmap_flag_bits: mmmap_flag_bits,
memfd_flag_bits,
page_size_or_huge_page_size,
}
}
}