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; 803989773SWedson Almeida Filho pub mod vec_ext; 9*b6a006e2SWedson Almeida Filho 10*b6a006e2SWedson Almeida Filho /// Flags to be used when allocating memory. 11*b6a006e2SWedson Almeida Filho /// 12*b6a006e2SWedson Almeida Filho /// They can be combined with the operators `|`, `&`, and `!`. 13*b6a006e2SWedson Almeida Filho /// 14*b6a006e2SWedson Almeida Filho /// Values can be used from the [`flags`] module. 15*b6a006e2SWedson Almeida Filho #[derive(Clone, Copy)] 16*b6a006e2SWedson Almeida Filho pub struct Flags(u32); 17*b6a006e2SWedson Almeida Filho 18*b6a006e2SWedson Almeida Filho impl core::ops::BitOr for Flags { 19*b6a006e2SWedson Almeida Filho type Output = Self; 20*b6a006e2SWedson Almeida Filho fn bitor(self, rhs: Self) -> Self::Output { 21*b6a006e2SWedson Almeida Filho Self(self.0 | rhs.0) 22*b6a006e2SWedson Almeida Filho } 23*b6a006e2SWedson Almeida Filho } 24*b6a006e2SWedson Almeida Filho 25*b6a006e2SWedson Almeida Filho impl core::ops::BitAnd for Flags { 26*b6a006e2SWedson Almeida Filho type Output = Self; 27*b6a006e2SWedson Almeida Filho fn bitand(self, rhs: Self) -> Self::Output { 28*b6a006e2SWedson Almeida Filho Self(self.0 & rhs.0) 29*b6a006e2SWedson Almeida Filho } 30*b6a006e2SWedson Almeida Filho } 31*b6a006e2SWedson Almeida Filho 32*b6a006e2SWedson Almeida Filho impl core::ops::Not for Flags { 33*b6a006e2SWedson Almeida Filho type Output = Self; 34*b6a006e2SWedson Almeida Filho fn not(self) -> Self::Output { 35*b6a006e2SWedson Almeida Filho Self(!self.0) 36*b6a006e2SWedson Almeida Filho } 37*b6a006e2SWedson Almeida Filho } 38*b6a006e2SWedson Almeida Filho 39*b6a006e2SWedson Almeida Filho /// Allocation flags. 40*b6a006e2SWedson Almeida Filho /// 41*b6a006e2SWedson Almeida Filho /// These are meant to be used in functions that can allocate memory. 42*b6a006e2SWedson Almeida Filho pub mod flags { 43*b6a006e2SWedson Almeida Filho use super::Flags; 44*b6a006e2SWedson Almeida Filho use crate::bindings; 45*b6a006e2SWedson Almeida Filho 46*b6a006e2SWedson Almeida Filho /// Zeroes out the allocated memory. 47*b6a006e2SWedson Almeida Filho /// 48*b6a006e2SWedson Almeida Filho /// This is normally or'd with other flags. 49*b6a006e2SWedson Almeida Filho pub const __GFP_ZERO: Flags = Flags(bindings::__GFP_ZERO); 50*b6a006e2SWedson Almeida Filho 51*b6a006e2SWedson Almeida Filho /// Users can not sleep and need the allocation to succeed. 52*b6a006e2SWedson Almeida Filho /// 53*b6a006e2SWedson Almeida Filho /// A lower watermark is applied to allow access to "atomic reserves". The current 54*b6a006e2SWedson Almeida Filho /// implementation doesn't support NMI and few other strict non-preemptive contexts (e.g. 55*b6a006e2SWedson Almeida Filho /// raw_spin_lock). The same applies to [`GFP_NOWAIT`]. 56*b6a006e2SWedson Almeida Filho pub const GFP_ATOMIC: Flags = Flags(bindings::GFP_ATOMIC); 57*b6a006e2SWedson Almeida Filho 58*b6a006e2SWedson Almeida Filho /// Typical for kernel-internal allocations. The caller requires ZONE_NORMAL or a lower zone 59*b6a006e2SWedson Almeida Filho /// for direct access but can direct reclaim. 60*b6a006e2SWedson Almeida Filho pub const GFP_KERNEL: Flags = Flags(bindings::GFP_KERNEL); 61*b6a006e2SWedson Almeida Filho 62*b6a006e2SWedson Almeida Filho /// The same as [`GFP_KERNEL`], except the allocation is accounted to kmemcg. 63*b6a006e2SWedson Almeida Filho pub const GFP_KERNEL_ACCOUNT: Flags = Flags(bindings::GFP_KERNEL_ACCOUNT); 64*b6a006e2SWedson Almeida Filho 65*b6a006e2SWedson Almeida Filho /// Ror kernel allocations that should not stall for direct reclaim, start physical IO or 66*b6a006e2SWedson Almeida Filho /// use any filesystem callback. It is very likely to fail to allocate memory, even for very 67*b6a006e2SWedson Almeida Filho /// small allocations. 68*b6a006e2SWedson Almeida Filho pub const GFP_NOWAIT: Flags = Flags(bindings::GFP_NOWAIT); 69*b6a006e2SWedson Almeida Filho } 70