rust: alloc: introduce allocation flags
We'll use them when allocating `Box`, `Arc`, and `UniqueArc` instances, as well as when allocating memory for `Vec` elements. These changes will come in subsequent patches. Reviewed-by: Benno Lossin <benno.lossin@proton.me> Signed-off-by: Wedson Almeida Filho <walmeida@microsoft.com> Link: https://lore.kernel.org/r/20240328013603.206764-6-wedsonaf@gmail.com Signed-off-by: Miguel Ojeda <ojeda@kernel.org>
This commit is contained in:
committed by
Miguel Ojeda
parent
9d0441bab7
commit
b6a006e21b
@ -6,3 +6,64 @@
|
||||
#[cfg(not(testlib))]
|
||||
mod allocator;
|
||||
pub mod vec_ext;
|
||||
|
||||
/// Flags to be used when allocating memory.
|
||||
///
|
||||
/// They can be combined with the operators `|`, `&`, and `!`.
|
||||
///
|
||||
/// Values can be used from the [`flags`] module.
|
||||
#[derive(Clone, Copy)]
|
||||
pub struct Flags(u32);
|
||||
|
||||
impl core::ops::BitOr for Flags {
|
||||
type Output = Self;
|
||||
fn bitor(self, rhs: Self) -> Self::Output {
|
||||
Self(self.0 | rhs.0)
|
||||
}
|
||||
}
|
||||
|
||||
impl core::ops::BitAnd for Flags {
|
||||
type Output = Self;
|
||||
fn bitand(self, rhs: Self) -> Self::Output {
|
||||
Self(self.0 & rhs.0)
|
||||
}
|
||||
}
|
||||
|
||||
impl core::ops::Not for Flags {
|
||||
type Output = Self;
|
||||
fn not(self) -> Self::Output {
|
||||
Self(!self.0)
|
||||
}
|
||||
}
|
||||
|
||||
/// Allocation flags.
|
||||
///
|
||||
/// These are meant to be used in functions that can allocate memory.
|
||||
pub mod flags {
|
||||
use super::Flags;
|
||||
use crate::bindings;
|
||||
|
||||
/// Zeroes out the allocated memory.
|
||||
///
|
||||
/// This is normally or'd with other flags.
|
||||
pub const __GFP_ZERO: Flags = Flags(bindings::__GFP_ZERO);
|
||||
|
||||
/// Users can not sleep and need the allocation to succeed.
|
||||
///
|
||||
/// A lower watermark is applied to allow access to "atomic reserves". The current
|
||||
/// implementation doesn't support NMI and few other strict non-preemptive contexts (e.g.
|
||||
/// raw_spin_lock). The same applies to [`GFP_NOWAIT`].
|
||||
pub const GFP_ATOMIC: Flags = Flags(bindings::GFP_ATOMIC);
|
||||
|
||||
/// Typical for kernel-internal allocations. The caller requires ZONE_NORMAL or a lower zone
|
||||
/// for direct access but can direct reclaim.
|
||||
pub const GFP_KERNEL: Flags = Flags(bindings::GFP_KERNEL);
|
||||
|
||||
/// The same as [`GFP_KERNEL`], except the allocation is accounted to kmemcg.
|
||||
pub const GFP_KERNEL_ACCOUNT: Flags = Flags(bindings::GFP_KERNEL_ACCOUNT);
|
||||
|
||||
/// Ror kernel allocations that should not stall for direct reclaim, start physical IO or
|
||||
/// use any filesystem callback. It is very likely to fail to allocate memory, even for very
|
||||
/// small allocations.
|
||||
pub const GFP_NOWAIT: Flags = Flags(bindings::GFP_NOWAIT);
|
||||
}
|
||||
|
Reference in New Issue
Block a user