131d94d8fSWedson Almeida Filho // SPDX-License-Identifier: GPL-2.0 231d94d8fSWedson Almeida Filho 331d94d8fSWedson Almeida Filho //! Extensions to the [`alloc`] crate. 431d94d8fSWedson Almeida Filho 531d94d8fSWedson Almeida Filho #[cfg(not(test))] 631d94d8fSWedson Almeida Filho #[cfg(not(testlib))] 731d94d8fSWedson Almeida Filho mod allocator; 808d3f549SWedson Almeida Filho pub mod box_ext; 903989773SWedson Almeida Filho pub mod vec_ext; 10b6a006e2SWedson Almeida Filho 112c109285SWedson Almeida Filho /// Indicates an allocation error. 122c109285SWedson Almeida Filho #[derive(Copy, Clone, PartialEq, Eq, Debug)] 132c109285SWedson Almeida Filho pub struct AllocError; 142c109285SWedson Almeida Filho 15b6a006e2SWedson Almeida Filho /// Flags to be used when allocating memory. 16b6a006e2SWedson Almeida Filho /// 17b6a006e2SWedson Almeida Filho /// They can be combined with the operators `|`, `&`, and `!`. 18b6a006e2SWedson Almeida Filho /// 19b6a006e2SWedson Almeida Filho /// Values can be used from the [`flags`] module. 20b6a006e2SWedson Almeida Filho #[derive(Clone, Copy)] 21b6a006e2SWedson Almeida Filho pub struct Flags(u32); 22b6a006e2SWedson Almeida Filho 23*fc6e66f4SAlice Ryhl impl Flags { 24*fc6e66f4SAlice Ryhl /// Get the raw representation of this flag. 25*fc6e66f4SAlice Ryhl pub(crate) fn as_raw(self) -> u32 { 26*fc6e66f4SAlice Ryhl self.0 27*fc6e66f4SAlice Ryhl } 28*fc6e66f4SAlice Ryhl } 29*fc6e66f4SAlice Ryhl 30b6a006e2SWedson Almeida Filho impl core::ops::BitOr for Flags { 31b6a006e2SWedson Almeida Filho type Output = Self; 32b6a006e2SWedson Almeida Filho fn bitor(self, rhs: Self) -> Self::Output { 33b6a006e2SWedson Almeida Filho Self(self.0 | rhs.0) 34b6a006e2SWedson Almeida Filho } 35b6a006e2SWedson Almeida Filho } 36b6a006e2SWedson Almeida Filho 37b6a006e2SWedson Almeida Filho impl core::ops::BitAnd for Flags { 38b6a006e2SWedson Almeida Filho type Output = Self; 39b6a006e2SWedson Almeida Filho fn bitand(self, rhs: Self) -> Self::Output { 40b6a006e2SWedson Almeida Filho Self(self.0 & rhs.0) 41b6a006e2SWedson Almeida Filho } 42b6a006e2SWedson Almeida Filho } 43b6a006e2SWedson Almeida Filho 44b6a006e2SWedson Almeida Filho impl core::ops::Not for Flags { 45b6a006e2SWedson Almeida Filho type Output = Self; 46b6a006e2SWedson Almeida Filho fn not(self) -> Self::Output { 47b6a006e2SWedson Almeida Filho Self(!self.0) 48b6a006e2SWedson Almeida Filho } 49b6a006e2SWedson Almeida Filho } 50b6a006e2SWedson Almeida Filho 51b6a006e2SWedson Almeida Filho /// Allocation flags. 52b6a006e2SWedson Almeida Filho /// 53b6a006e2SWedson Almeida Filho /// These are meant to be used in functions that can allocate memory. 54b6a006e2SWedson Almeida Filho pub mod flags { 55b6a006e2SWedson Almeida Filho use super::Flags; 56b6a006e2SWedson Almeida Filho 57b6a006e2SWedson Almeida Filho /// Zeroes out the allocated memory. 58b6a006e2SWedson Almeida Filho /// 59b6a006e2SWedson Almeida Filho /// This is normally or'd with other flags. 60b6a006e2SWedson Almeida Filho pub const __GFP_ZERO: Flags = Flags(bindings::__GFP_ZERO); 61b6a006e2SWedson Almeida Filho 62ab44079eSAlice Ryhl /// Allow the allocation to be in high memory. 63ab44079eSAlice Ryhl /// 64ab44079eSAlice Ryhl /// Allocations in high memory may not be mapped into the kernel's address space, so this can't 65ab44079eSAlice Ryhl /// be used with `kmalloc` and other similar methods. 66ab44079eSAlice Ryhl /// 67ab44079eSAlice Ryhl /// This is normally or'd with other flags. 68ab44079eSAlice Ryhl pub const __GFP_HIGHMEM: Flags = Flags(bindings::__GFP_HIGHMEM); 69ab44079eSAlice Ryhl 70b6a006e2SWedson Almeida Filho /// Users can not sleep and need the allocation to succeed. 71b6a006e2SWedson Almeida Filho /// 72b6a006e2SWedson Almeida Filho /// A lower watermark is applied to allow access to "atomic reserves". The current 73b6a006e2SWedson Almeida Filho /// implementation doesn't support NMI and few other strict non-preemptive contexts (e.g. 74b6a006e2SWedson Almeida Filho /// raw_spin_lock). The same applies to [`GFP_NOWAIT`]. 75b6a006e2SWedson Almeida Filho pub const GFP_ATOMIC: Flags = Flags(bindings::GFP_ATOMIC); 76b6a006e2SWedson Almeida Filho 77b6a006e2SWedson Almeida Filho /// Typical for kernel-internal allocations. The caller requires ZONE_NORMAL or a lower zone 78b6a006e2SWedson Almeida Filho /// for direct access but can direct reclaim. 79b6a006e2SWedson Almeida Filho pub const GFP_KERNEL: Flags = Flags(bindings::GFP_KERNEL); 80b6a006e2SWedson Almeida Filho 81b6a006e2SWedson Almeida Filho /// The same as [`GFP_KERNEL`], except the allocation is accounted to kmemcg. 82b6a006e2SWedson Almeida Filho pub const GFP_KERNEL_ACCOUNT: Flags = Flags(bindings::GFP_KERNEL_ACCOUNT); 83b6a006e2SWedson Almeida Filho 84d3ee24ccSAlice Ryhl /// For kernel allocations that should not stall for direct reclaim, start physical IO or 85b6a006e2SWedson Almeida Filho /// use any filesystem callback. It is very likely to fail to allocate memory, even for very 86b6a006e2SWedson Almeida Filho /// small allocations. 87b6a006e2SWedson Almeida Filho pub const GFP_NOWAIT: Flags = Flags(bindings::GFP_NOWAIT); 88b6a006e2SWedson Almeida Filho } 89