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