Enum memmap2::UncheckedAdvice
source · #[repr(i32)]pub enum UncheckedAdvice {
DontNeed = 4,
Free = 8,
Remove = 9,
}
Expand description
Values supported by [Mmap::unsafe_advise
][crate::Mmap::unsafe_advise] and [MmapMut::unsafe_advise
][crate::MmapMut::unsafe_advise] functions.
These flags can be passed to the madvise (2) system call and effects on the mapped pages which are conceptually writes, i.e. the change the observable contents of these pages which implies undefined behaviour if the mapping is still borrowed.
Hence, these potentially unsafe flags must be used with the unsafe methods and the programmer has to justify that the code does not keep any borrows of the mapping active while the mapped pages are updated by the kernel’s memory management subsystem.
Variants§
DontNeed = 4
MADV_DONTNEED
Do not expect access in the near future. (For the time being, the application is finished with the given range, so the kernel can free resources associated with it.)
After a successful MADV_DONTNEED operation, the semantics of memory access in the specified region are changed: subsequent accesses of pages in the range will succeed, but will result in either repopulating the memory contents from the up-to-date contents of the underlying mapped file (for shared file mappings, shared anonymous mappings, and shmem-based techniques such as System V shared memory segments) or zero-fill-on-demand pages for anonymous private mappings.
Note that, when applied to shared mappings, MADV_DONTNEED might not lead to immediate freeing of the pages in the range. The kernel is free to delay freeing the pages until an appropriate moment. The resident set size (RSS) of the calling process will be immediately reduced however.
MADV_DONTNEED cannot be applied to locked pages, Huge TLB pages, or VM_PFNMAP pages. (Pages marked with the kernel- internal VM_PFNMAP flag are special memory areas that are not managed by the virtual memory subsystem. Such pages are typically created by device drivers that map the pages into user space.)
§Safety
Using the returned value with conceptually write to the mapped pages, i.e. borrowing the mapping when the pages are freed results in undefined behaviour.
Free = 8
MADV_FREE - Linux (since Linux 4.5) and Darwin
The application no longer requires the pages in the range specified by addr and len. The kernel can thus free these pages, but the freeing could be delayed until memory pressure occurs. For each of the pages that has been marked to be freed but has not yet been freed, the free operation will be canceled if the caller writes into the page. After a successful MADV_FREE operation, any stale data (i.e., dirty, unwritten pages) will be lost when the kernel frees the pages. However, subsequent writes to pages in the range will succeed and then kernel cannot free those dirtied pages, so that the caller can always see just written data. If there is no subsequent write, the kernel can free the pages at any time. Once pages in the range have been freed, the caller will see zero-fill- on-demand pages upon subsequent page references.
The MADV_FREE operation can be applied only to private anonymous pages (see mmap(2)). In Linux before version 4.12, when freeing pages on a swapless system, the pages in the given range are freed instantly, regardless of memory pressure.
§Safety
Using the returned value with conceptually write to the mapped pages, i.e. borrowing the mapping while the pages are still being freed results in undefined behaviour.
Remove = 9
MADV_REMOVE - Linux only (since Linux 2.6.16)
Free up a given range of pages and its associated backing store. This is equivalent to punching a hole in the corresponding byte range of the backing store (see fallocate(2)). Subsequent accesses in the specified address range will see bytes containing zero.
The specified address range must be mapped shared and writable. This flag cannot be applied to locked pages, Huge TLB pages, or VM_PFNMAP pages.
In the initial implementation, only tmpfs(5) was supported MADV_REMOVE; but since Linux 3.5, any filesystem which supports the fallocate(2) FALLOC_FL_PUNCH_HOLE mode also supports MADV_REMOVE. Hugetlbfs fails with the error EINVAL and other filesystems fail with the error EOPNOTSUPP.
§Safety
Using the returned value with conceptually write to the mapped pages, i.e. borrowing the mapping when the pages are freed results in undefined behaviour.
Implementations§
source§impl UncheckedAdvice
impl UncheckedAdvice
sourcepub fn is_supported(self) -> bool
pub fn is_supported(self) -> bool
Performs a runtime check if this advice is supported by the kernel.
Only supported on Linux. See the madvise(2)
man page.
Trait Implementations§
source§impl Clone for UncheckedAdvice
impl Clone for UncheckedAdvice
source§fn clone(&self) -> UncheckedAdvice
fn clone(&self) -> UncheckedAdvice
1.0.0 · source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source
. Read moresource§impl Debug for UncheckedAdvice
impl Debug for UncheckedAdvice
source§impl Hash for UncheckedAdvice
impl Hash for UncheckedAdvice
source§impl PartialEq for UncheckedAdvice
impl PartialEq for UncheckedAdvice
impl Copy for UncheckedAdvice
impl Eq for UncheckedAdvice
impl StructuralPartialEq for UncheckedAdvice
Auto Trait Implementations§
impl Freeze for UncheckedAdvice
impl RefUnwindSafe for UncheckedAdvice
impl Send for UncheckedAdvice
impl Sync for UncheckedAdvice
impl Unpin for UncheckedAdvice
impl UnwindSafe for UncheckedAdvice
Blanket Implementations§
source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
source§unsafe fn clone_to_uninit(&self, dst: *mut T)
unsafe fn clone_to_uninit(&self, dst: *mut T)
clone_to_uninit
)