pub struct HugePageAligned<I: OsBacked> { /* private fields */ }Expand description
HugePageAligned wrapper.
huge_page_size defaults to a platform-appropriate value
(default_huge_page_size); pass an explicit size to override
(useful for hugetlbfs setups with 1 GiB pages, or testing).
Implementations§
Source§impl<I: OsBacked> HugePageAligned<I>
impl<I: OsBacked> HugePageAligned<I>
Sourcepub fn new(inner: I) -> Option<Self>
pub fn new(inner: I) -> Option<Self>
Wrap with the platform-default huge page size.
On Linux/Windows with x86_64 or aarch64 (non-Apple) this is
2 MiB. On macOS aarch64 (Apple Silicon, 16 KiB native granule)
it is 32 MiB. Returns None if the platform-default would not
satisfy Self::with_huge_page_size’s invariants (impossible on
supported targets).
Sourcepub fn with_huge_page_size(inner: I, huge_page_size: usize) -> Option<Self>
pub fn with_huge_page_size(inner: I, huge_page_size: usize) -> Option<Self>
Wrap with an explicit huge page size. Must be a power of two and at least 4 KiB (any smaller would not be a “huge” page on any real architecture).
Sourcepub fn huge_page_size(&self) -> usize
pub fn huge_page_size(&self) -> usize
Configured huge page size in bytes.
Sourcepub fn min_purge_size(&self) -> usize
pub fn min_purge_size(&self) -> usize
Minimum purge granularity. Equal to huge_page_size.
Calls to release_pages below this
size are dropped.
Trait Implementations§
Source§impl<I: OsBacked> Allocator for HugePageAligned<I>
impl<I: OsBacked> Allocator for HugePageAligned<I>
Source§fn allocate(&self, layout: NonZeroLayout) -> Result<NonNull<[u8]>, AllocError>
fn allocate(&self, layout: NonZeroLayout) -> Result<NonNull<[u8]>, AllocError>
layout. The returned slice’s length is
at least layout.size() but may be larger.Source§fn capacity_bytes(&self) -> Option<usize>
fn capacity_bytes(&self) -> Option<usize>
None for unbounded
allocators like System. Used by Watermark to compute thresholds.Source§fn corruption_events(&self) -> u64
fn corruption_events(&self) -> u64
Source§unsafe fn usable_size(
&self,
ptr: NonNull<u8>,
layout: NonZeroLayout,
) -> Option<usize>
unsafe fn usable_size( &self, ptr: NonNull<u8>, layout: NonZeroLayout, ) -> Option<usize>
None — implementors that track usable size
override. Read moreSource§fn allocate_zeroed(
&self,
layout: NonZeroLayout,
) -> Result<NonNull<[u8]>, AllocError>
fn allocate_zeroed( &self, layout: NonZeroLayout, ) -> Result<NonNull<[u8]>, AllocError>
Source§unsafe fn grow(
&self,
ptr: NonNull<u8>,
old: NonZeroLayout,
new: NonZeroLayout,
) -> Result<NonNull<[u8]>, AllocError>
unsafe fn grow( &self, ptr: NonNull<u8>, old: NonZeroLayout, new: NonZeroLayout, ) -> Result<NonNull<[u8]>, AllocError>
Source§unsafe fn shrink(
&self,
ptr: NonNull<u8>,
old: NonZeroLayout,
new: NonZeroLayout,
) -> Result<NonNull<[u8]>, AllocError>
unsafe fn shrink( &self, ptr: NonNull<u8>, old: NonZeroLayout, new: NonZeroLayout, ) -> Result<NonNull<[u8]>, AllocError>
Source§impl<I: OsBacked> Deallocator for HugePageAligned<I>
impl<I: OsBacked> Deallocator for HugePageAligned<I>
Source§unsafe fn deallocate(&self, ptr: NonNull<u8>, layout: NonZeroLayout)
unsafe fn deallocate(&self, ptr: NonNull<u8>, layout: NonZeroLayout)
Source§impl<I: OsBacked + FixedRange> FixedRange for HugePageAligned<I>
impl<I: OsBacked + FixedRange> FixedRange for HugePageAligned<I>
Source§impl<I: OsBacked> OsBacked for HugePageAligned<I>
impl<I: OsBacked> OsBacked for HugePageAligned<I>
Source§unsafe fn release_pages(&self, ptr: NonNull<u8>, size: usize)
unsafe fn release_pages(&self, ptr: NonNull<u8>, size: usize)
Round the requested range inward to whole huge pages. If nothing remains after rounding, the call is dropped — this is the “refuse to fragment a huge page” guarantee. Partial purges that would force the kernel to demote a promoted huge page back to 4 KiB are silently elided.
Source§unsafe fn protect(&self, ptr: NonNull<u8>, size: usize, flags: ProtectFlags)
unsafe fn protect(&self, ptr: NonNull<u8>, size: usize, flags: ProtectFlags)
Forwarded unchanged. Protection changes don’t fragment a huge
page the way a purge does, and a caller using PROT_NONE for a
guard page explicitly wants the page split.