TlbFlusher

Struct TlbFlusher 

Source
pub struct TlbFlusher<'a, G: PinCurrentCpu> { /* private fields */ }
Expand description

A TLB flusher that is aware of which CPUs are needed to be flushed.

The flusher needs to stick to the current CPU.

Implementations§

Source§

impl<'a, G: PinCurrentCpu> TlbFlusher<'a, G>

Source

pub fn new(target_cpus: &'a AtomicCpuSet, pin_current_guard: G) -> Self

Creates a new TLB flusher with the specified CPUs to be flushed.

The target CPUs should be a reference to an AtomicCpuSet that will be loaded upon Self::dispatch_tlb_flush.

The flusher needs to stick to the current CPU. So please provide a guard that implements PinCurrentCpu.

Source

pub fn issue_tlb_flush<M: AnyFrameMeta>(&mut self, op: TlbFlushOp)

Issues a pending TLB flush request.

This function does not guarantee to flush the TLB entries on either this CPU or remote CPUs. The flush requests are only performed when Self::dispatch_tlb_flush is called.

Source

pub fn issue_tlb_flush_with<M: AnyFrameMeta>( &mut self, op: TlbFlushOp, drop_after_flush: Frame<M>, )

Issues a TLB flush request that must happen before dropping the page.

If we need to remove a mapped page from the page table, we can only recycle the page after all the relevant TLB entries in all CPUs are flushed. Otherwise if the page is recycled for other purposes, the user space program can still access the page through the TLB entries. This method is designed to be used in such cases.

Source

pub fn dispatch_tlb_flush(&mut self)

Dispatches all the pending TLB flush requests.

All previous pending requests issued by Self::issue_tlb_flush or Self::issue_tlb_flush_with starts to be processed after this function. But it may not be synchronous. Upon the return of this function, the TLB entries may not be coherent.

Source

pub fn sync_tlb_flush(&mut self)

Waits for all the previous TLB flush requests to be completed.

After this function, all TLB entries corresponding to previous dispatched TLB flush requests are guaranteed to be coherent.

The TLB flush requests are issued with Self::issue_tlb_flush and dispatched with Self::dispatch_tlb_flush. This method will not dispatch any issued requests so it will not guarantee TLB coherence of requests that are not dispatched.

§Panics

This method panics if the IRQs are disabled. Since the remote flush are processed in IRQs, two CPUs may deadlock if they are waiting for each other’s TLB coherence.

Auto Trait Implementations§

§

impl<'a, G> Freeze for TlbFlusher<'a, G>
where G: Freeze,

§

impl<'a, G> RefUnwindSafe for TlbFlusher<'a, G>
where G: RefUnwindSafe,

§

impl<'a, G> Send for TlbFlusher<'a, G>
where G: Send,

§

impl<'a, G> Sync for TlbFlusher<'a, G>
where G: Sync,

§

impl<'a, G> Unpin for TlbFlusher<'a, G>
where G: Unpin,

§

impl<'a, G> UnwindSafe for TlbFlusher<'a, G>
where G: UnwindSafe,

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

§

impl<T, VERUS_SPEC__A> FromSpec<T> for VERUS_SPEC__A
where VERUS_SPEC__A: From<T>,

§

fn obeys_from_spec() -> bool

§

fn from_spec(v: T) -> VERUS_SPEC__A

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

§

impl<T, VERUS_SPEC__A> IntoSpec<T> for VERUS_SPEC__A
where VERUS_SPEC__A: Into<T>,

§

fn obeys_into_spec() -> bool

§

fn into_spec(self) -> T

§

impl<T, U> IntoSpecImpl<U> for T
where U: From<T>,

§

fn obeys_into_spec() -> bool

§

fn into_spec(self) -> U

Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
§

impl<T, VERUS_SPEC__A> TryFromSpec<T> for VERUS_SPEC__A
where VERUS_SPEC__A: TryFrom<T>,

§

fn obeys_try_from_spec() -> bool

§

fn try_from_spec( v: T, ) -> Result<VERUS_SPEC__A, <VERUS_SPEC__A as TryFrom<T>>::Error>

Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<T, VERUS_SPEC__A> TryIntoSpec<T> for VERUS_SPEC__A
where VERUS_SPEC__A: TryInto<T>,

§

fn obeys_try_into_spec() -> bool

§

fn try_into_spec(self) -> Result<T, <VERUS_SPEC__A as TryInto<T>>::Error>

§

impl<T, U> TryIntoSpecImpl<U> for T
where U: TryFrom<T>,

§

fn obeys_try_into_spec() -> bool

§

fn try_into_spec(self) -> Result<U, <U as TryFrom<T>>::Error>