pub struct MutationGate { /* private fields */ }Expand description
Serialization point for all VMA/PTE publication.
AddrSpace is still protected by its sleepable outer mutex, but keeping the
epoch and the typestate transition together prevents a future mutation
caller from publishing a receipt against a stale root. The gate never
allocates under its commit lock or performs page-table or file operations.
Implementations§
Source§impl MutationGate
impl MutationGate
pub const fn new() -> Self
pub fn current_epoch(&self) -> VmEpoch
pub fn needs_repair(&self) -> bool
pub fn mark_needs_repair(&self)
pub fn clear_repair(&self)
pub fn begin( &self, space_id: AddressSpaceId, targets: usize, ) -> PreparedMutation
Sourcepub fn begin_fresh_mapping(&self, space_id: AddressSpaceId) -> PreparedMutation
pub fn begin_fresh_mapping(&self, space_id: AddressSpaceId) -> PreparedMutation
Begins publication into a software-empty range.
The resulting zero-target request may use the fresh-PTE fast path only while no older unacknowledged shootdown overlaps its range. Commit checks that precondition under the same serialization gate that publishes the new epoch.
Sourcepub fn begin_with_active_targets(
&self,
space_id: AddressSpaceId,
active_targets: Arc<AtomicUsize>,
) -> PreparedMutation
pub fn begin_with_active_targets( &self, space_id: AddressSpaceId, active_targets: Arc<AtomicUsize>, ) -> PreparedMutation
Begins a mutation whose final shootdown targets are frozen at commit.
Scheduler activation can race the prepare/apply phase. Keeping the
shared active-CPU source until the short publication step lets commit
include a CPU that installed this root after prepare, while the
resulting MutationReceipt still contains an immutable mask.
Sourcepub fn commit(
&self,
mutation: PreparedMutation,
) -> Result<MutationReceipt, MutationError>
pub fn commit( &self, mutation: PreparedMutation, ) -> Result<MutationReceipt, MutationError>
Publishes a fully applied transaction and advances the epoch.
A pending TLB obligation is returned as an error; the caller must retain
the receipt and complete the acknowledgements before reclaiming old
mappings. AddrSpace uses a zero-target request for its current local
page-table path and therefore takes this fast path synchronously.
Sourcepub fn pending_count(&self) -> usize
pub fn pending_count(&self) -> usize
Number of receipts waiting for remote TLB acknowledgement.
pub fn pending_requests(&self) -> Result<Vec<TlbRequest>, MutationError>
Sourcepub fn pending_request(
&self,
space_id: AddressSpaceId,
epoch: VmEpoch,
) -> Option<TlbRequest>
pub fn pending_request( &self, space_id: AddressSpaceId, epoch: VmEpoch, ) -> Option<TlbRequest>
Returns one immutable shootdown request without exposing the pending receipt or its mutation state. The address-space owner uses this to hand the obligation to the architecture TLB service after publication.
Sourcepub fn acknowledge(
&self,
space_id: AddressSpaceId,
epoch: VmEpoch,
cpu: usize,
) -> Result<Option<MutationReceipt>, MutationError>
pub fn acknowledge( &self, space_id: AddressSpaceId, epoch: VmEpoch, cpu: usize, ) -> Result<Option<MutationReceipt>, MutationError>
Acknowledge one CPU for a published receipt. The receipt remains in quarantine until the last requested CPU confirms the invalidation.
Trait Implementations§
Auto Trait Implementations§
impl !Freeze for MutationGate
impl !RefUnwindSafe for MutationGate
impl Send for MutationGate
impl Sync for MutationGate
impl Unpin for MutationGate
impl UnsafeUnpin for MutationGate
impl UnwindSafe for MutationGate
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