pub struct TlbQuarantine { /* private fields */ }Expand description
Holds detached frames until every CPU named by a shootdown acknowledges it.
The queue is intentionally frame-only: VMA metadata and page-cache locks are never held while an IPI is sent or retried. A timeout leaves entries in this queue, making unsafe reuse impossible.
Implementations§
Source§impl TlbQuarantine
impl TlbQuarantine
Sourcepub fn defer(
&self,
frame: FrameLease,
request: TlbRequest,
) -> Result<(), QuarantineFailure>
pub fn defer( &self, frame: FrameLease, request: TlbRequest, ) -> Result<(), QuarantineFailure>
Adds a detached frame to the quarantine.
The frame is returned inside QuarantineFailure when the queue
cannot reserve storage. Dropping a frame on this path would release
physical memory while an old translation may still be live, so there
is deliberately no infallible or fire-and-forget variant of this API.
pub fn try_defer( &self, frame: FrameLease, request: TlbRequest, ) -> Result<(), QuarantineFailure>
Sourcepub fn try_defer_recoverable(
&self,
frame: FrameLease,
request: TlbRequest,
) -> Result<(), QuarantineFailure>
pub fn try_defer_recoverable( &self, frame: FrameLease, request: TlbRequest, ) -> Result<(), QuarantineFailure>
Fallible insertion that returns ownership of the frame on allocation failure. Callers performing teardown can then quarantine it in a higher-level repair queue instead of accidentally dropping a frame while a stale translation may still exist.
pub fn pending(&self) -> usize
pub fn requests(&self) -> Result<Vec<TlbRequest>, QuarantineError>
pub fn contains_request(&self, space_id: AddressSpaceId, epoch: VmEpoch) -> bool
Sourcepub fn reap_ready(&self) -> Result<Vec<FrameLease>, QuarantineError>
pub fn reap_ready(&self) -> Result<Vec<FrameLease>, QuarantineError>
Removes entries whose obligations were already satisfied by a local
flush. Remote acknowledgements are still handled by
Self::acknowledge.
Sourcepub fn acknowledge(
&self,
space_id: AddressSpaceId,
epoch: VmEpoch,
cpu: usize,
) -> Result<Vec<FrameLease>, QuarantineError>
pub fn acknowledge( &self, space_id: AddressSpaceId, epoch: VmEpoch, cpu: usize, ) -> Result<Vec<FrameLease>, QuarantineError>
Records one acknowledgement and returns frames that became reclaimable.
Trait Implementations§
Source§impl Debug for TlbQuarantine
impl Debug for TlbQuarantine
Source§impl Default for TlbQuarantine
impl Default for TlbQuarantine
Source§fn default() -> TlbQuarantine
fn default() -> TlbQuarantine
Auto Trait Implementations§
impl !Freeze for TlbQuarantine
impl !RefUnwindSafe for TlbQuarantine
impl !UnwindSafe for TlbQuarantine
impl Send for TlbQuarantine
impl Sync for TlbQuarantine
impl Unpin for TlbQuarantine
impl UnsafeUnpin for TlbQuarantine
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
Source§impl<T> DirectoryReadState for T
impl<T> DirectoryReadState for T
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
Source§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
Source§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>, which can then be
downcast into Box<dyn ConcreteType> where ConcreteType implements Trait.Source§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
Rc<Trait> (where Trait: Downcast) to Rc<Any>, which can then be further
downcast into Rc<ConcreteType> where ConcreteType implements Trait.Source§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
&Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &Any’s vtable from &Trait’s.Source§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &mut Any’s vtable from &mut Trait’s.Source§impl<T> DowncastSend for T
impl<T> DowncastSend for T
Source§impl<T> DowncastSync for T
impl<T> DowncastSync for T
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more