MemoryLimits

Struct MemoryLimits 

Source
#[non_exhaustive]
pub struct MemoryLimits { pub max: Option<u64>, pub high: Option<u64>, pub low: Option<u64>, pub swap_max: Option<u64>, }
Expand description

Memory controller limits (memory.max / memory.high / memory.low / memory.swap.max). Each field is None by default (inherit from parent / no limit).

Set via CgroupDef::memory_max, CgroupDef::memory_high, CgroupDef::memory_low, CgroupDef::memory_unlimited, CgroupDef::memory_swap_max, or CgroupDef::memory_swap_unlimited. Construct directly only when copying a MemoryLimits across CgroupDefs — the builder methods are the preferred entry point because they keep test code in chain position and route the per-knob value through the framework’s validation seam at apply_setup.

Fields (Non-exhaustive)§

This struct is marked as non-exhaustive
Non-exhaustive structs could have additional fields added in future. Therefore, non-exhaustive structs cannot be constructed in external crates using the traditional Struct { .. } syntax; cannot be matched against without a wildcard ..; and struct update syntax will not work.
§max: Option<u64>

memory.max hard ceiling in bytes. Crossing this triggers the cgroup OOM killer per Documentation/admin-guide/ cgroup-v2.rst’s “Memory Interface Files”. None writes "max" (no hard limit).

§high: Option<u64>

memory.high soft throttle threshold in bytes. Crossing this triggers reclaim throttling but NOT OOM-kill. None writes "max".

§low: Option<u64>

memory.low soft protection threshold in bytes. The kernel preferentially reclaims FROM other cgroups before reclaiming this cgroup’s memory below low. None writes "0" (no protection).

§swap_max: Option<u64>

memory.swap.max ceiling on the cgroup’s swap usage in bytes. None writes "max" (no swap cap, the kernel default). The kernel parses the wire value via page_counter_memparse — either the literal "max" or a decimal byte count (swap_max_write in mm/memcontrol.c).

§CONFIG_SWAP=n kernel detection

memory.swap.max only exists when the kernel was built with CONFIG_SWAP=y; on swap-disabled builds the file is absent and the wire-time write returns ENOENT. The framework only emits the write when swap_max.is_some() — the explicit opt-in matches the per-knob semantics of the pids block, so tests that never call CgroupDef::memory_swap_max / CgroupDef::memory_swap_unlimited succeed verbatim on a swap-disabled kernel.

swap_max = Some(N) on a CONFIG_SWAP=n kernel surfaces as a hard scenario failure: apply_setup propagates the ENOENT from set_memory_swap_max’s write_with_timeout up the error chain with the memory.swap.max filename in the context. Test authors who target the swap controller must either (a) gate the swap_max call on a host probe, or (b) require the test kernel be built with CONFIG_SWAP=y and document the requirement on the test.

§ktstr’s kernel config and swap

ktstr.kconfig (the project-level kernel-config fragment that cargo ktstr merges into the test kernel’s defconfig) does NOT pin CONFIG_SWAP=y — swap is not a test-framework requirement, and many test scenarios run faster without it. Tests that call memory_swap_max therefore must either extend the per-test kconfig fragment (passed alongside ktstr.kconfig at kernel-build time) or detect at scenario-setup time by reading /proc/swaps (a missing file or empty body indicates no swap subsystem) or /proc/config.gz (search for CONFIG_SWAP=y). The framework does NOT auto-detect because host probing is policy that belongs to the test author, not the workload runner.

Trait Implementations§

Source§

impl Clone for MemoryLimits

Source§

fn clone(&self) -> MemoryLimits

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for MemoryLimits

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for MemoryLimits

Source§

fn default() -> MemoryLimits

Returns the “default value” for a type. Read more
Source§

impl PartialEq for MemoryLimits

Source§

fn eq(&self, other: &MemoryLimits) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
Source§

impl Eq for MemoryLimits

Source§

impl StructuralPartialEq for MemoryLimits

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
§

impl<Q, K> Equivalent<K> for Q
where Q: Eq + ?Sized, K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where Q: Eq + ?Sized, K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where Q: Eq + ?Sized, K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where Q: Eq + ?Sized, K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> if into_left is true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> if into_left(&self) returns true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
§

impl<T> Pointable for T

§

const ALIGN: usize

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> PolicyExt for T
where T: ?Sized,

§

fn and<P, B, E>(self, other: P) -> And<T, P>
where T: Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] only if self and other return Action::Follow. Read more
§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where T: Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] if either self or other returns Action::Follow. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a [WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a [WithDispatch] wrapper. Read more
§

impl<T> MaybeSend for T
where T: Send,

§

impl<T> MaybeSend for T
where T: Send,