88 lines · 2.6 KB · Rust
RawDownload
// SPDX-License-Identifier: GPL-2.0 //! Extensions to the [`alloc`] crate. #[cfg(not(test))]#[cfg(not(testlib))]mod allocator;pub mod box_ext;pub mod vec_ext; /// Indicates an allocation error.#[derive(Copy, Clone, PartialEq, Eq, Debug)]pub struct AllocError; /// 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 Flags {    /// Get the raw representation of this flag.    pub(crate) fn as_raw(self) -> u32 {        self.0    }} 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;     /// Zeroes out the allocated memory.    ///    /// This is normally or'd with other flags.    pub const __GFP_ZERO: Flags = Flags(bindings::__GFP_ZERO);     /// Allow the allocation to be in high memory.    ///    /// Allocations in high memory may not be mapped into the kernel's address space, so this can't    /// be used with `kmalloc` and other similar methods.    ///    /// This is normally or'd with other flags.    pub const __GFP_HIGHMEM: Flags = Flags(bindings::__GFP_HIGHMEM);     /// 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);     /// For 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);}