| // 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); | |
| } |