Struct devices::IrqLevelEvent
source · pub struct IrqLevelEvent {
trigger_evt: Event,
resample_evt: Event,
}
Expand description
A structure suitable for implementing level triggered interrupts in device backends.
Level-triggered interrupts require the device to monitor a resample event from the IRQ chip,
which can be retrieved with IrqLevelEvent::get_resample()
. When the guest OS acknowledges
the interrupt with an End of Interrupt (EOI) command, the IRQ chip will signal the resample
event. Each time the resample event is signalled, the device should re-check its state and call
IrqLevelEvent::trigger()
again if the interrupt should still be asserted.
Fields§
§trigger_evt: Event
An event used by the device backend to signal hypervisor/VM about data or new unit of work being available.
resample_evt: Event
An event used by the hypervisor to signal device backend that it completed processing a
unit of work and that device should re-raise trigger_evt
if additional work needs to
be done.
Implementations§
source§impl IrqLevelEvent
impl IrqLevelEvent
pub fn new() -> Result<IrqLevelEvent>
pub fn try_clone(&self) -> Result<IrqLevelEvent>
sourcepub fn from_event_pair(trigger_evt: Event, resample_evt: Event) -> IrqLevelEvent
pub fn from_event_pair(trigger_evt: Event, resample_evt: Event) -> IrqLevelEvent
Creates an instance of IrqLevelEvent from an existing pair of events.
pub fn get_trigger(&self) -> &Event
pub fn get_resample(&self) -> &Event
sourcepub fn clear_trigger(&self)
pub fn clear_trigger(&self)
Allows code servicing interrupt to consume or clear the event.
sourcepub fn trigger_resample(&self) -> Result<()>
pub fn trigger_resample(&self) -> Result<()>
Allows code servicing interrupt to signal that processing is done and that the backend should go ahead and re-trigger it if there is more work needs to be done. Note that typically resampling is signalled not by individual backends, but rather by the code implementing interrupt controller.
sourcepub fn clear_resample(&self)
pub fn clear_resample(&self)
Allows backend to consume or clear the resample event.
Trait Implementations§
source§impl AsRawDescriptors for IrqLevelEvent
impl AsRawDescriptors for IrqLevelEvent
source§fn as_raw_descriptors(&self) -> Vec<RawDescriptor>
fn as_raw_descriptors(&self) -> Vec<RawDescriptor>
source§impl Debug for IrqLevelEvent
impl Debug for IrqLevelEvent
source§impl<'de> Deserialize<'de> for IrqLevelEvent
impl<'de> Deserialize<'de> for IrqLevelEvent
source§fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
Auto Trait Implementations§
impl RefUnwindSafe for IrqLevelEvent
impl Send for IrqLevelEvent
impl Sync for IrqLevelEvent
impl Unpin for IrqLevelEvent
impl UnwindSafe for IrqLevelEvent
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<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>
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>
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)
&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)
&mut Trait
(where Trait: Downcast
) to &Any
. This is needed since Rust cannot
generate &mut Any
’s vtable from &mut Trait
’s.