Struct devices::virtio::pvclock::PvClockWorker
source · struct PvClockWorker {
tsc_frequency: u64,
suspend_time: Option<PvclockInstant>,
total_injected_ns: Arc<AtomicU64>,
total_suspend_tsc_delta: u64,
pvclock_shared_data: Option<PvclockSharedData>,
mem: GuestMemory,
}
Expand description
Worker struct for the virtio-pvclock device.
Handles virtio requests, storing information about suspend/resume, adjusting the pvclock data in shared memory, and injecting suspend durations via config changes.
Fields§
§tsc_frequency: u64
§suspend_time: Option<PvclockInstant>
§total_injected_ns: Arc<AtomicU64>
§total_suspend_tsc_delta: u64
§mem: GuestMemory
Implementations§
source§impl PvClockWorker
impl PvClockWorker
pub fn new( tsc_frequency: u64, total_injected_ns: Arc<AtomicU64>, mem: GuestMemory ) -> Self
fn from_snapshot( tsc_frequency: u64, total_injected_ns: Arc<AtomicU64>, snap: PvClockWorkerSnapshot, mem: GuestMemory ) -> Self
sourcefn set_pvclock_page(&mut self, addr: u64) -> Result<()>
fn set_pvclock_page(&mut self, addr: u64) -> Result<()>
Initialize the pvclock for initial boot. We assume that the systemtime of 0 corresponds to the tsc time of 0, so we do not set these. We set the tsc frequency based on the vcpu tsc frequency and we set PVCLOCK_TSC_STABLE_BIT in flags to tell the guest that it’s safe to use vcpu0’s pvclock page for use by the vdso. The order of writing the different fields doesn’t matter at this point, but does matter when updating.
pub fn suspend(&mut self)
pub fn resume(&mut self) -> Result<u64>
fn get_suspended_duration(suspend_time: &PvclockInstant) -> Duration
fn set_suspended_time(&mut self) -> Result<u64>
fn increment_pvclock_seqlock(&mut self) -> Result<()>
fn set_guest_stopped_bit(&mut self) -> Result<()>
Trait Implementations§
source§impl From<PvClockWorker> for PvClockWorkerSnapshot
impl From<PvClockWorker> for PvClockWorkerSnapshot
source§fn from(worker: PvClockWorker) -> Self
fn from(worker: PvClockWorker) -> Self
Converts to this type from the input type.
Auto Trait Implementations§
impl RefUnwindSafe for PvClockWorker
impl Send for PvClockWorker
impl Sync for PvClockWorker
impl Unpin for PvClockWorker
impl UnwindSafe for PvClockWorker
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
Mutably borrows from an owned value. Read more
§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
Convert
Box<dyn Trait>
(where Trait: Downcast
) to Box<dyn Any>
. Box<dyn Any>
can
then be further downcast
into Box<ConcreteType>
where ConcreteType
implements Trait
.§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
Convert
Rc<Trait>
(where Trait: Downcast
) to Rc<Any>
. Rc<Any>
can then be
further downcast
into Rc<ConcreteType>
where ConcreteType
implements Trait
.§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
Convert
&Trait
(where Trait: Downcast
) to &Any
. This is needed since Rust cannot
generate &Any
’s vtable from &Trait
’s.§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
Convert
&mut Trait
(where Trait: Downcast
) to &Any
. This is needed since Rust cannot
generate &mut Any
’s vtable from &mut Trait
’s.