|
7 | 7 |
|
8 | 8 | use std::fmt;
|
9 | 9 | use std::sync::Arc;
|
10 |
| -use std::sync::atomic::{AtomicU32, Ordering}; |
| 10 | +use std::sync::atomic::AtomicU32; |
11 | 11 |
|
12 | 12 | use vmm_sys_util::eventfd::EventFd;
|
13 | 13 |
|
14 | 14 | use super::ActivateError;
|
15 |
| -use super::mmio::{VIRTIO_MMIO_INT_CONFIG, VIRTIO_MMIO_INT_VRING}; |
16 | 15 | use super::queue::{Queue, QueueError};
|
| 16 | +use super::transport::mmio::IrqTrigger; |
17 | 17 | use crate::devices::virtio::AsAny;
|
18 |
| -use crate::logger::{error, warn}; |
| 18 | +use crate::logger::warn; |
19 | 19 | use crate::vstate::memory::GuestMemoryMmap;
|
20 | 20 |
|
21 | 21 | /// Enum that indicates if a VirtioDevice is inactive or has been activated
|
@@ -44,46 +44,6 @@ impl DeviceState {
|
44 | 44 | }
|
45 | 45 | }
|
46 | 46 |
|
47 |
| -/// The 2 types of interrupt sources in MMIO transport. |
48 |
| -#[derive(Debug)] |
49 |
| -pub enum IrqType { |
50 |
| - /// Interrupt triggered by change in config. |
51 |
| - Config, |
52 |
| - /// Interrupt triggered by used vring buffers. |
53 |
| - Vring, |
54 |
| -} |
55 |
| - |
56 |
| -/// Helper struct that is responsible for triggering guest IRQs |
57 |
| -#[derive(Debug)] |
58 |
| -pub struct IrqTrigger { |
59 |
| - pub(crate) irq_status: Arc<AtomicU32>, |
60 |
| - pub(crate) irq_evt: EventFd, |
61 |
| -} |
62 |
| - |
63 |
| -impl IrqTrigger { |
64 |
| - pub fn new() -> std::io::Result<Self> { |
65 |
| - Ok(Self { |
66 |
| - irq_status: Arc::new(AtomicU32::new(0)), |
67 |
| - irq_evt: EventFd::new(libc::EFD_NONBLOCK)?, |
68 |
| - }) |
69 |
| - } |
70 |
| - |
71 |
| - pub fn trigger_irq(&self, irq_type: IrqType) -> Result<(), std::io::Error> { |
72 |
| - let irq = match irq_type { |
73 |
| - IrqType::Config => VIRTIO_MMIO_INT_CONFIG, |
74 |
| - IrqType::Vring => VIRTIO_MMIO_INT_VRING, |
75 |
| - }; |
76 |
| - self.irq_status.fetch_or(irq, Ordering::SeqCst); |
77 |
| - |
78 |
| - self.irq_evt.write(1).map_err(|err| { |
79 |
| - error!("Failed to send irq to the guest: {:?}", err); |
80 |
| - err |
81 |
| - })?; |
82 |
| - |
83 |
| - Ok(()) |
84 |
| - } |
85 |
| -} |
86 |
| - |
87 | 47 | /// Trait for virtio devices to be driven by a virtio transport.
|
88 | 48 | ///
|
89 | 49 | /// The lifecycle of a virtio device is to be moved to a virtio transport, which will then query the
|
@@ -200,47 +160,6 @@ impl fmt::Debug for dyn VirtioDevice {
|
200 | 160 | pub(crate) mod tests {
|
201 | 161 | use super::*;
|
202 | 162 |
|
203 |
| - impl IrqTrigger { |
204 |
| - pub fn has_pending_irq(&self, irq_type: IrqType) -> bool { |
205 |
| - if let Ok(num_irqs) = self.irq_evt.read() { |
206 |
| - if num_irqs == 0 { |
207 |
| - return false; |
208 |
| - } |
209 |
| - |
210 |
| - let irq_status = self.irq_status.load(Ordering::SeqCst); |
211 |
| - return matches!( |
212 |
| - (irq_status, irq_type), |
213 |
| - (VIRTIO_MMIO_INT_CONFIG, IrqType::Config) |
214 |
| - | (VIRTIO_MMIO_INT_VRING, IrqType::Vring) |
215 |
| - ); |
216 |
| - } |
217 |
| - |
218 |
| - false |
219 |
| - } |
220 |
| - } |
221 |
| - |
222 |
| - #[test] |
223 |
| - fn irq_trigger() { |
224 |
| - let irq_trigger = IrqTrigger::new().unwrap(); |
225 |
| - assert_eq!(irq_trigger.irq_status.load(Ordering::SeqCst), 0); |
226 |
| - |
227 |
| - // Check that there are no pending irqs. |
228 |
| - assert!(!irq_trigger.has_pending_irq(IrqType::Config)); |
229 |
| - assert!(!irq_trigger.has_pending_irq(IrqType::Vring)); |
230 |
| - |
231 |
| - // Check that trigger_irq() correctly generates irqs. |
232 |
| - irq_trigger.trigger_irq(IrqType::Config).unwrap(); |
233 |
| - assert!(irq_trigger.has_pending_irq(IrqType::Config)); |
234 |
| - irq_trigger.irq_status.store(0, Ordering::SeqCst); |
235 |
| - irq_trigger.trigger_irq(IrqType::Vring).unwrap(); |
236 |
| - assert!(irq_trigger.has_pending_irq(IrqType::Vring)); |
237 |
| - |
238 |
| - // Check trigger_irq() failure case (irq_evt is full). |
239 |
| - irq_trigger.irq_evt.write(u64::MAX - 1).unwrap(); |
240 |
| - irq_trigger.trigger_irq(IrqType::Config).unwrap_err(); |
241 |
| - irq_trigger.trigger_irq(IrqType::Vring).unwrap_err(); |
242 |
| - } |
243 |
| - |
244 | 163 | #[derive(Debug)]
|
245 | 164 | struct MockVirtioDevice {
|
246 | 165 | acked_features: u64,
|
|
0 commit comments