summary refs log tree commit diff
diff options
context:
space:
mode:
authorDaniel Verkamp <dverkamp@chromium.org>2019-11-01 10:01:23 -0700
committerCommit Bot <commit-bot@chromium.org>2019-11-18 07:43:03 +0000
commit24eeed2b6fb6306f404238d1343db4b55aa9beef (patch)
tree0a347754994d470b3df3e3811430b4da6758ea17
parente7c46cad4150ecb18a0832a61042522974543938 (diff)
downloadcrosvm-24eeed2b6fb6306f404238d1343db4b55aa9beef.tar
crosvm-24eeed2b6fb6306f404238d1343db4b55aa9beef.tar.gz
crosvm-24eeed2b6fb6306f404238d1343db4b55aa9beef.tar.bz2
crosvm-24eeed2b6fb6306f404238d1343db4b55aa9beef.tar.lz
crosvm-24eeed2b6fb6306f404238d1343db4b55aa9beef.tar.xz
crosvm-24eeed2b6fb6306f404238d1343db4b55aa9beef.tar.zst
crosvm-24eeed2b6fb6306f404238d1343db4b55aa9beef.zip
devices: virtio: pass Interrupt to activate()
Factor out the common creation of struct Interrupt.

No functional change.

BUG=chromium:854765
TEST=./build_test

Change-Id: Idf8804771ba1af5181818f643e15e1b42918258a
Signed-off-by: Daniel Verkamp <dverkamp@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/crosvm/+/1898268
Tested-by: kokoro <noreply+kokoro@google.com>
-rw-r--r--devices/src/virtio/balloon.rs14
-rw-r--r--devices/src/virtio/block.rs14
-rw-r--r--devices/src/virtio/fs/mod.rs15
-rw-r--r--devices/src/virtio/gpu/mod.rs17
-rw-r--r--devices/src/virtio/input/mod.rs17
-rw-r--r--devices/src/virtio/net.rs16
-rw-r--r--devices/src/virtio/p9.rs16
-rw-r--r--devices/src/virtio/pmem.rs17
-rw-r--r--devices/src/virtio/rng.rs17
-rw-r--r--devices/src/virtio/tpm.rs16
-rw-r--r--devices/src/virtio/vhost/net.rs28
-rw-r--r--devices/src/virtio/vhost/vsock.rs16
-rw-r--r--devices/src/virtio/vhost/worker.rs16
-rw-r--r--devices/src/virtio/virtio_device.rs10
-rw-r--r--devices/src/virtio/virtio_pci_common_config.rs9
-rw-r--r--devices/src/virtio/virtio_pci_device.rs10
-rw-r--r--devices/src/virtio/wl.rs26
-rw-r--r--fuzz/block_fuzzer.rs12
18 files changed, 58 insertions, 228 deletions
diff --git a/devices/src/virtio/balloon.rs b/devices/src/virtio/balloon.rs
index c93d60b..2d50c3d 100644
--- a/devices/src/virtio/balloon.rs
+++ b/devices/src/virtio/balloon.rs
@@ -8,9 +8,7 @@ use std::os::unix::io::{AsRawFd, RawFd};
 use std::sync::atomic::{AtomicUsize, Ordering};
 use std::sync::Arc;
 use std::thread;
-use sync::Mutex;
 
-use crate::pci::MsixConfig;
 use data_model::{DataInit, Le32};
 use msg_socket::MsgReceiver;
 use sys_util::{
@@ -320,10 +318,7 @@ impl VirtioDevice for Balloon {
     fn activate(
         &mut self,
         mem: GuestMemory,
-        interrupt_evt: EventFd,
-        interrupt_resample_evt: EventFd,
-        msix_config: Option<Arc<Mutex<MsixConfig>>>,
-        status: Arc<AtomicUsize>,
+        interrupt: Interrupt,
         mut queues: Vec<Queue>,
         queue_evts: Vec<EventFd>,
     ) {
@@ -346,12 +341,7 @@ impl VirtioDevice for Balloon {
             .name("virtio_balloon".to_string())
             .spawn(move || {
                 let mut worker = Worker {
-                    interrupt: Interrupt::new(
-                        status,
-                        interrupt_evt,
-                        interrupt_resample_evt,
-                        msix_config,
-                    ),
+                    interrupt,
                     mem,
                     inflate_queue: queues.remove(0),
                     deflate_queue: queues.remove(0),
diff --git a/devices/src/virtio/block.rs b/devices/src/virtio/block.rs
index e3e5247..477a9de 100644
--- a/devices/src/virtio/block.rs
+++ b/devices/src/virtio/block.rs
@@ -8,13 +8,11 @@ use std::io::{self, Seek, SeekFrom, Write};
 use std::mem::size_of;
 use std::os::unix::io::{AsRawFd, RawFd};
 use std::result;
-use std::sync::atomic::AtomicUsize;
 use std::sync::Arc;
 use std::thread;
 use std::time::Duration;
 use std::u32;
 
-use crate::pci::MsixConfig;
 use data_model::{DataInit, Le16, Le32, Le64};
 use disk::DiskFile;
 use msg_socket::{MsgReceiver, MsgSender};
@@ -723,10 +721,7 @@ impl VirtioDevice for Block {
     fn activate(
         &mut self,
         mem: GuestMemory,
-        interrupt_evt: EventFd,
-        interrupt_resample_evt: EventFd,
-        msix_config: Option<Arc<Mutex<MsixConfig>>>,
-        status: Arc<AtomicUsize>,
+        interrupt: Interrupt,
         queues: Vec<Queue>,
         mut queue_evts: Vec<EventFd>,
     ) {
@@ -752,12 +747,7 @@ impl VirtioDevice for Block {
                         .name("virtio_blk".to_string())
                         .spawn(move || {
                             let mut worker = Worker {
-                                interrupt: Interrupt::new(
-                                    status,
-                                    interrupt_evt,
-                                    interrupt_resample_evt,
-                                    msix_config,
-                                ),
+                                interrupt,
                                 queues,
                                 mem,
                                 disk_image,
diff --git a/devices/src/virtio/fs/mod.rs b/devices/src/virtio/fs/mod.rs
index 5e8ac41..ce7739a 100644
--- a/devices/src/virtio/fs/mod.rs
+++ b/devices/src/virtio/fs/mod.rs
@@ -7,15 +7,12 @@ use std::fmt;
 use std::io;
 use std::mem;
 use std::os::unix::io::RawFd;
-use std::sync::atomic::AtomicUsize;
 use std::sync::Arc;
 use std::thread;
 
 use data_model::{DataInit, Le32};
-use sync::Mutex;
 use sys_util::{error, warn, Error as SysError, EventFd, GuestMemory};
 
-use crate::pci::MsixConfig;
 use crate::virtio::{
     copy_config, DescriptorError, Interrupt, Queue, VirtioDevice, TYPE_FS, VIRTIO_F_VERSION_1,
 };
@@ -226,10 +223,7 @@ impl VirtioDevice for Fs {
     fn activate(
         &mut self,
         guest_mem: GuestMemory,
-        interrupt_evt: EventFd,
-        interrupt_resample_evt: EventFd,
-        msix_config: Option<Arc<Mutex<MsixConfig>>>,
-        status: Arc<AtomicUsize>,
+        interrupt: Interrupt,
         queues: Vec<Queue>,
         queue_evts: Vec<EventFd>,
     ) {
@@ -240,12 +234,7 @@ impl VirtioDevice for Fs {
         let fs = self.fs.take().expect("missing file system implementation");
 
         let server = Arc::new(Server::new(fs));
-        let irq = Arc::new(Interrupt::new(
-            status,
-            interrupt_evt,
-            interrupt_resample_evt,
-            msix_config,
-        ));
+        let irq = Arc::new(interrupt);
 
         for (idx, (queue, evt)) in queues.into_iter().zip(queue_evts.into_iter()).enumerate() {
             let (self_kill_evt, kill_evt) =
diff --git a/devices/src/virtio/gpu/mod.rs b/devices/src/virtio/gpu/mod.rs
index 210f815..c9cd5cc 100644
--- a/devices/src/virtio/gpu/mod.rs
+++ b/devices/src/virtio/gpu/mod.rs
@@ -14,11 +14,8 @@ use std::num::NonZeroU8;
 use std::os::unix::io::{AsRawFd, RawFd};
 use std::path::PathBuf;
 use std::rc::Rc;
-use std::sync::atomic::AtomicUsize;
-use std::sync::Arc;
 use std::thread;
 use std::time::Duration;
-use sync::Mutex;
 
 use data_model::*;
 
@@ -38,7 +35,7 @@ use super::{
 
 use self::backend::Backend;
 use self::protocol::*;
-use crate::pci::{MsixConfig, PciBarConfiguration, PciBarPrefetchable, PciBarRegionType};
+use crate::pci::{PciBarConfiguration, PciBarPrefetchable, PciBarRegionType};
 
 use vm_control::VmMemoryControlRequestSocket;
 
@@ -822,10 +819,7 @@ impl VirtioDevice for Gpu {
     fn activate(
         &mut self,
         mem: GuestMemory,
-        interrupt_evt: EventFd,
-        interrupt_resample_evt: EventFd,
-        msix_config: Option<Arc<Mutex<MsixConfig>>>,
-        interrupt_status: Arc<AtomicUsize>,
+        interrupt: Interrupt,
         mut queues: Vec<Queue>,
         mut queue_evts: Vec<EventFd>,
     ) {
@@ -871,12 +865,7 @@ impl VirtioDevice for Gpu {
                             };
 
                         Worker {
-                            interrupt: Interrupt::new(
-                                interrupt_status,
-                                interrupt_evt,
-                                interrupt_resample_evt,
-                                msix_config,
-                            ),
+                            interrupt,
                             exit_evt,
                             mem,
                             ctrl_queue,
diff --git a/devices/src/virtio/input/mod.rs b/devices/src/virtio/input/mod.rs
index 664f121..2490c52 100644
--- a/devices/src/virtio/input/mod.rs
+++ b/devices/src/virtio/input/mod.rs
@@ -25,12 +25,7 @@ use std::fmt::{self, Display};
 use std::io::Read;
 use std::io::Write;
 use std::mem::size_of;
-use std::sync::atomic::AtomicUsize;
-use std::sync::Arc;
 use std::thread;
-use sync::Mutex;
-
-use crate::pci::MsixConfig;
 
 const EVENT_QUEUE_SIZE: u16 = 64;
 const STATUS_QUEUE_SIZE: u16 = 64;
@@ -607,10 +602,7 @@ where
     fn activate(
         &mut self,
         mem: GuestMemory,
-        interrupt_evt: EventFd,
-        interrupt_resample_evt: EventFd,
-        msix_config: Option<Arc<Mutex<MsixConfig>>>,
-        status: Arc<AtomicUsize>,
+        interrupt: Interrupt,
         mut queues: Vec<Queue>,
         mut queue_evts: Vec<EventFd>,
     ) {
@@ -639,12 +631,7 @@ where
                 .name(String::from("virtio_input"))
                 .spawn(move || {
                     let mut worker = Worker {
-                        interrupt: Interrupt::new(
-                            status,
-                            interrupt_evt,
-                            interrupt_resample_evt,
-                            msix_config,
-                        ),
+                        interrupt,
                         event_source: source,
                         event_queue,
                         status_queue,
diff --git a/devices/src/virtio/net.rs b/devices/src/virtio/net.rs
index 5c95e06..a2b1058 100644
--- a/devices/src/virtio/net.rs
+++ b/devices/src/virtio/net.rs
@@ -8,12 +8,8 @@ use std::mem;
 use std::net::Ipv4Addr;
 use std::os::unix::io::{AsRawFd, RawFd};
 use std::result;
-use std::sync::atomic::AtomicUsize;
-use std::sync::Arc;
 use std::thread;
-use sync::Mutex;
 
-use crate::pci::MsixConfig;
 use net_sys;
 use net_util::{Error as TapError, MacAddress, TapT};
 use sys_util::Error as SysError;
@@ -435,10 +431,7 @@ where
     fn activate(
         &mut self,
         mem: GuestMemory,
-        interrupt_evt: EventFd,
-        interrupt_resample_evt: EventFd,
-        msix_config: Option<Arc<Mutex<MsixConfig>>>,
-        status: Arc<AtomicUsize>,
+        interrupt: Interrupt,
         mut queues: Vec<Queue>,
         mut queue_evts: Vec<EventFd>,
     ) {
@@ -458,12 +451,7 @@ where
                             let rx_queue = queues.remove(0);
                             let tx_queue = queues.remove(0);
                             let mut worker = Worker {
-                                interrupt: Interrupt::new(
-                                    status,
-                                    interrupt_evt,
-                                    interrupt_resample_evt,
-                                    msix_config,
-                                ),
+                                interrupt,
                                 mem,
                                 rx_queue,
                                 tx_queue,
diff --git a/devices/src/virtio/p9.rs b/devices/src/virtio/p9.rs
index d891d22..5e483c3 100644
--- a/devices/src/virtio/p9.rs
+++ b/devices/src/virtio/p9.rs
@@ -8,12 +8,8 @@ use std::mem;
 use std::os::unix::io::RawFd;
 use std::path::{Path, PathBuf};
 use std::result;
-use std::sync::atomic::AtomicUsize;
-use std::sync::Arc;
 use std::thread;
-use sync::Mutex;
 
-use crate::pci::MsixConfig;
 use p9;
 use sys_util::{error, warn, Error as SysError, EventFd, GuestMemory, PollContext, PollToken};
 use virtio_sys::vhost::VIRTIO_F_VERSION_1;
@@ -227,10 +223,7 @@ impl VirtioDevice for P9 {
     fn activate(
         &mut self,
         guest_mem: GuestMemory,
-        interrupt_evt: EventFd,
-        interrupt_resample_evt: EventFd,
-        msix_config: Option<Arc<Mutex<MsixConfig>>>,
-        status: Arc<AtomicUsize>,
+        interrupt: Interrupt,
         mut queues: Vec<Queue>,
         mut queue_evts: Vec<EventFd>,
     ) {
@@ -253,12 +246,7 @@ impl VirtioDevice for P9 {
                     .name("virtio_9p".to_string())
                     .spawn(move || {
                         let mut worker = Worker {
-                            interrupt: Interrupt::new(
-                                status,
-                                interrupt_evt,
-                                interrupt_resample_evt,
-                                msix_config,
-                            ),
+                            interrupt,
                             mem: guest_mem,
                             queue: queues.remove(0),
                             server,
diff --git a/devices/src/virtio/pmem.rs b/devices/src/virtio/pmem.rs
index 07ed137..931b037 100644
--- a/devices/src/virtio/pmem.rs
+++ b/devices/src/virtio/pmem.rs
@@ -6,18 +6,13 @@ use std::fmt::{self, Display};
 use std::fs::File;
 use std::io;
 use std::os::unix::io::{AsRawFd, RawFd};
-use std::sync::atomic::AtomicUsize;
-use std::sync::Arc;
 use std::thread;
-use sync::Mutex;
 
 use sys_util::Result as SysResult;
 use sys_util::{error, EventFd, GuestAddress, GuestMemory, PollContext, PollToken};
 
 use data_model::{DataInit, Le32, Le64};
 
-use crate::pci::MsixConfig;
-
 use super::{
     copy_config, DescriptorChain, DescriptorError, Interrupt, Queue, Reader, VirtioDevice, Writer,
     TYPE_PMEM, VIRTIO_F_VERSION_1,
@@ -268,10 +263,7 @@ impl VirtioDevice for Pmem {
     fn activate(
         &mut self,
         memory: GuestMemory,
-        interrupt_event: EventFd,
-        interrupt_resample_event: EventFd,
-        msix_config: Option<Arc<Mutex<MsixConfig>>>,
-        status: Arc<AtomicUsize>,
+        interrupt: Interrupt,
         mut queues: Vec<Queue>,
         mut queue_events: Vec<EventFd>,
     ) {
@@ -297,12 +289,7 @@ impl VirtioDevice for Pmem {
                 .name("virtio_pmem".to_string())
                 .spawn(move || {
                     let mut worker = Worker {
-                        interrupt: Interrupt::new(
-                            status,
-                            interrupt_event,
-                            interrupt_resample_event,
-                            msix_config,
-                        ),
+                        interrupt,
                         memory,
                         disk_image,
                         queue,
diff --git a/devices/src/virtio/rng.rs b/devices/src/virtio/rng.rs
index 9fa2e59..a7fc3d7 100644
--- a/devices/src/virtio/rng.rs
+++ b/devices/src/virtio/rng.rs
@@ -7,17 +7,12 @@ use std::fmt::{self, Display};
 use std::fs::File;
 use std::io;
 use std::os::unix::io::{AsRawFd, RawFd};
-use std::sync::atomic::AtomicUsize;
-use std::sync::Arc;
 use std::thread;
-use sync::Mutex;
 
 use sys_util::{error, warn, EventFd, GuestMemory, PollContext, PollToken};
 
 use super::{Interrupt, Queue, VirtioDevice, Writer, TYPE_RNG};
 
-use crate::pci::MsixConfig;
-
 const QUEUE_SIZE: u16 = 256;
 const QUEUE_SIZES: &[u16] = &[QUEUE_SIZE];
 
@@ -177,10 +172,7 @@ impl VirtioDevice for Rng {
     fn activate(
         &mut self,
         mem: GuestMemory,
-        interrupt_evt: EventFd,
-        interrupt_resample_evt: EventFd,
-        msix_config: Option<Arc<Mutex<MsixConfig>>>,
-        status: Arc<AtomicUsize>,
+        interrupt: Interrupt,
         mut queues: Vec<Queue>,
         mut queue_evts: Vec<EventFd>,
     ) {
@@ -205,12 +197,7 @@ impl VirtioDevice for Rng {
                     .name("virtio_rng".to_string())
                     .spawn(move || {
                         let mut worker = Worker {
-                            interrupt: Interrupt::new(
-                                status,
-                                interrupt_evt,
-                                interrupt_resample_evt,
-                                msix_config,
-                            ),
+                            interrupt,
                             queue,
                             mem,
                             random_file,
diff --git a/devices/src/virtio/tpm.rs b/devices/src/virtio/tpm.rs
index abad4e2..95f7092 100644
--- a/devices/src/virtio/tpm.rs
+++ b/devices/src/virtio/tpm.rs
@@ -9,12 +9,8 @@ use std::io::{self, Read, Write};
 use std::ops::BitOrAssign;
 use std::os::unix::io::RawFd;
 use std::path::PathBuf;
-use std::sync::atomic::AtomicUsize;
-use std::sync::Arc;
 use std::thread;
 
-use crate::pci::MsixConfig;
-use sync::Mutex;
 use sys_util::{error, EventFd, GuestMemory, PollContext, PollToken};
 use tpm2;
 
@@ -204,10 +200,7 @@ impl VirtioDevice for Tpm {
     fn activate(
         &mut self,
         mem: GuestMemory,
-        interrupt_evt: EventFd,
-        interrupt_resample_evt: EventFd,
-        msix_config: Option<Arc<Mutex<MsixConfig>>>,
-        interrupt_status: Arc<AtomicUsize>,
+        interrupt: Interrupt,
         mut queues: Vec<Queue>,
         mut queue_evts: Vec<EventFd>,
     ) {
@@ -237,12 +230,7 @@ impl VirtioDevice for Tpm {
         self.kill_evt = Some(self_kill_evt);
 
         let worker = Worker {
-            interrupt: Interrupt::new(
-                interrupt_status,
-                interrupt_evt,
-                interrupt_resample_evt,
-                msix_config,
-            ),
+            interrupt,
             queue,
             mem,
             queue_evt,
diff --git a/devices/src/virtio/vhost/net.rs b/devices/src/virtio/vhost/net.rs
index c07623d..1196200 100644
--- a/devices/src/virtio/vhost/net.rs
+++ b/devices/src/virtio/vhost/net.rs
@@ -5,10 +5,7 @@
 use std::mem;
 use std::net::Ipv4Addr;
 use std::os::unix::io::{AsRawFd, RawFd};
-use std::sync::atomic::AtomicUsize;
-use std::sync::Arc;
 use std::thread;
-use sync::Mutex;
 
 use net_sys;
 use net_util::{MacAddress, TapT};
@@ -19,8 +16,7 @@ use virtio_sys::virtio_net;
 
 use super::worker::Worker;
 use super::{Error, Result};
-use crate::pci::MsixConfig;
-use crate::virtio::{Queue, VirtioDevice, TYPE_NET};
+use crate::virtio::{Interrupt, Queue, VirtioDevice, TYPE_NET};
 
 const QUEUE_SIZE: u16 = 256;
 const NUM_QUEUES: usize = 2;
@@ -179,10 +175,7 @@ where
     fn activate(
         &mut self,
         _: GuestMemory,
-        interrupt_evt: EventFd,
-        interrupt_resample_evt: EventFd,
-        msix_config: Option<Arc<Mutex<MsixConfig>>>,
-        status: Arc<AtomicUsize>,
+        interrupt: Interrupt,
         queues: Vec<Queue>,
         queue_evts: Vec<EventFd>,
     ) {
@@ -203,10 +196,7 @@ where
                                     queues,
                                     vhost_net_handle,
                                     vhost_interrupt,
-                                    status,
-                                    interrupt_evt,
-                                    interrupt_resample_evt,
-                                    msix_config,
+                                    interrupt,
                                     acked_features,
                                 );
                                 let activate_vqs = |handle: &U| -> Result<()> {
@@ -245,6 +235,8 @@ pub mod tests {
     use super::*;
     use net_util::fakes::FakeTap;
     use std::result;
+    use std::sync::atomic::AtomicUsize;
+    use std::sync::Arc;
     use sys_util::{GuestAddress, GuestMemory, GuestMemoryError};
     use vhost::net::fakes::FakeNet;
 
@@ -298,10 +290,12 @@ pub mod tests {
         // Just testing that we don't panic, for now
         net.activate(
             guest_memory,
-            EventFd::new().unwrap(),
-            EventFd::new().unwrap(),
-            None,
-            Arc::new(AtomicUsize::new(0)),
+            Interrupt::new(
+                Arc::new(AtomicUsize::new(0)),
+                EventFd::new().unwrap(),
+                EventFd::new().unwrap(),
+                None,
+            ),
             vec![Queue::new(1)],
             vec![EventFd::new().unwrap()],
         );
diff --git a/devices/src/virtio/vhost/vsock.rs b/devices/src/virtio/vhost/vsock.rs
index 6dc0fbb..ed95b8b 100644
--- a/devices/src/virtio/vhost/vsock.rs
+++ b/devices/src/virtio/vhost/vsock.rs
@@ -3,10 +3,7 @@
 // found in the LICENSE file.
 
 use std::os::unix::io::{AsRawFd, RawFd};
-use std::sync::atomic::AtomicUsize;
-use std::sync::Arc;
 use std::thread;
-use sync::Mutex;
 
 use data_model::{DataInit, Le64};
 
@@ -15,8 +12,7 @@ use vhost::Vsock as VhostVsockHandle;
 
 use super::worker::Worker;
 use super::{Error, Result};
-use crate::pci::MsixConfig;
-use crate::virtio::{copy_config, Queue, VirtioDevice, TYPE_VSOCK};
+use crate::virtio::{copy_config, Interrupt, Queue, VirtioDevice, TYPE_VSOCK};
 
 const QUEUE_SIZE: u16 = 256;
 const NUM_QUEUES: usize = 3;
@@ -146,10 +142,7 @@ impl VirtioDevice for Vsock {
     fn activate(
         &mut self,
         _: GuestMemory,
-        interrupt_evt: EventFd,
-        interrupt_resample_evt: EventFd,
-        msix_config: Option<Arc<Mutex<MsixConfig>>>,
-        status: Arc<AtomicUsize>,
+        interrupt: Interrupt,
         queues: Vec<Queue>,
         queue_evts: Vec<EventFd>,
     ) {
@@ -173,10 +166,7 @@ impl VirtioDevice for Vsock {
                                 vhost_queues,
                                 vhost_handle,
                                 interrupts,
-                                status,
-                                interrupt_evt,
-                                interrupt_resample_evt,
-                                msix_config,
+                                interrupt,
                                 acked_features,
                             );
                             let activate_vqs = |handle: &VhostVsockHandle| -> Result<()> {
diff --git a/devices/src/virtio/vhost/worker.rs b/devices/src/virtio/vhost/worker.rs
index e88b929..21aabfd 100644
--- a/devices/src/virtio/vhost/worker.rs
+++ b/devices/src/virtio/vhost/worker.rs
@@ -3,15 +3,11 @@
 // found in the LICENSE file.
 
 use std::os::raw::c_ulonglong;
-use std::sync::atomic::AtomicUsize;
-use std::sync::Arc;
-use sync::Mutex;
 
 use sys_util::{EventFd, PollContext, PollToken};
 use vhost::Vhost;
 
 use super::{Error, Result};
-use crate::pci::MsixConfig;
 use crate::virtio::{Interrupt, Queue};
 
 /// Worker that takes care of running the vhost device.  This mainly involves forwarding interrupts
@@ -31,19 +27,11 @@ impl<T: Vhost> Worker<T> {
         queues: Vec<Queue>,
         vhost_handle: T,
         vhost_interrupt: Vec<EventFd>,
-        interrupt_status: Arc<AtomicUsize>,
-        interrupt_evt: EventFd,
-        interrupt_resample_evt: EventFd,
-        msix_config: Option<Arc<Mutex<MsixConfig>>>,
+        interrupt: Interrupt,
         acked_features: u64,
     ) -> Worker<T> {
         Worker {
-            interrupt: Interrupt::new(
-                interrupt_status,
-                interrupt_evt,
-                interrupt_resample_evt,
-                msix_config,
-            ),
+            interrupt,
             queues,
             vhost_handle,
             vhost_interrupt,
diff --git a/devices/src/virtio/virtio_device.rs b/devices/src/virtio/virtio_device.rs
index de4e24c..281e098 100644
--- a/devices/src/virtio/virtio_device.rs
+++ b/devices/src/virtio/virtio_device.rs
@@ -3,14 +3,11 @@
 // found in the LICENSE file.
 
 use std::os::unix::io::RawFd;
-use std::sync::atomic::AtomicUsize;
-use std::sync::Arc;
-use sync::Mutex;
 
 use sys_util::{EventFd, GuestMemory};
 
 use super::*;
-use crate::pci::{MsixConfig, PciBarConfiguration, PciCapability};
+use crate::pci::{PciBarConfiguration, PciCapability};
 
 /// Trait for virtio devices to be driven by a virtio transport.
 ///
@@ -69,10 +66,7 @@ pub trait VirtioDevice: Send {
     fn activate(
         &mut self,
         mem: GuestMemory,
-        interrupt_evt: EventFd,
-        interrupt_resample_evt: EventFd,
-        msix_config: Option<Arc<Mutex<MsixConfig>>>,
-        status: Arc<AtomicUsize>,
+        interrupt: Interrupt,
         queues: Vec<Queue>,
         queue_evts: Vec<EventFd>,
     );
diff --git a/devices/src/virtio/virtio_pci_common_config.rs b/devices/src/virtio/virtio_pci_common_config.rs
index d1ea3e8..78af4ff 100644
--- a/devices/src/virtio/virtio_pci_common_config.rs
+++ b/devices/src/virtio/virtio_pci_common_config.rs
@@ -238,11 +238,7 @@ impl VirtioPciCommonConfig {
 mod tests {
     use super::*;
 
-    use crate::pci::MsixConfig;
     use std::os::unix::io::RawFd;
-    use std::sync::atomic::AtomicUsize;
-    use std::sync::Arc;
-    use sync::Mutex;
     use sys_util::{EventFd, GuestMemory};
 
     struct DummyDevice(u32);
@@ -262,10 +258,7 @@ mod tests {
         fn activate(
             &mut self,
             _mem: GuestMemory,
-            _interrupt_evt: EventFd,
-            _interrupt_resample_evt: EventFd,
-            _msix_config: Option<Arc<Mutex<MsixConfig>>>,
-            _status: Arc<AtomicUsize>,
+            _interrupt: Interrupt,
             _queues: Vec<Queue>,
             _queue_evts: Vec<EventFd>,
         ) {
diff --git a/devices/src/virtio/virtio_pci_device.rs b/devices/src/virtio/virtio_pci_device.rs
index 43b3a74..c535ab5 100644
--- a/devices/src/virtio/virtio_pci_device.rs
+++ b/devices/src/virtio/virtio_pci_device.rs
@@ -613,12 +613,16 @@ impl PciDevice for VirtioPciDevice {
                             None
                         };
 
-                        self.device.activate(
-                            mem,
+                        let interrupt = Interrupt::new(
+                            self.interrupt_status.clone(),
                             interrupt_evt,
                             interrupt_resample_evt,
                             msix_config,
-                            self.interrupt_status.clone(),
+                        );
+
+                        self.device.activate(
+                            mem,
+                            interrupt,
                             self.queues.clone(),
                             self.queue_evts.split_off(0),
                         );
diff --git a/devices/src/virtio/wl.rs b/devices/src/virtio/wl.rs
index 81732a2..d8b9bae 100644
--- a/devices/src/virtio/wl.rs
+++ b/devices/src/virtio/wl.rs
@@ -44,11 +44,8 @@ use std::os::unix::net::UnixStream;
 use std::path::{Path, PathBuf};
 use std::rc::Rc;
 use std::result;
-use std::sync::atomic::AtomicUsize;
-use std::sync::Arc;
 use std::thread;
 use std::time::Duration;
-use sync::Mutex;
 
 #[cfg(feature = "wl-dmabuf")]
 use libc::{dup, EBADF, EINVAL};
@@ -73,7 +70,6 @@ use super::resource_bridge::*;
 use super::{
     DescriptorChain, Interrupt, Queue, Reader, VirtioDevice, Writer, TYPE_WL, VIRTIO_F_VERSION_1,
 };
-use crate::pci::MsixConfig;
 use vm_control::{MaybeOwnedFd, VmMemoryControlRequestSocket, VmMemoryRequest, VmMemoryResponse};
 
 const VIRTWL_SEND_MAX_ALLOCS: usize = 28;
@@ -1333,10 +1329,7 @@ struct Worker {
 impl Worker {
     fn new(
         mem: GuestMemory,
-        interrupt_evt: EventFd,
-        interrupt_resample_evt: EventFd,
-        interrupt_status: Arc<AtomicUsize>,
-        msix_config: Option<Arc<Mutex<MsixConfig>>>,
+        interrupt: Interrupt,
         in_queue: Queue,
         out_queue: Queue,
         wayland_path: PathBuf,
@@ -1345,12 +1338,7 @@ impl Worker {
         resource_bridge: Option<ResourceRequestSocket>,
     ) -> Worker {
         Worker {
-            interrupt: Interrupt::new(
-                interrupt_status,
-                interrupt_evt,
-                interrupt_resample_evt,
-                msix_config,
-            ),
+            interrupt,
             mem,
             in_queue,
             out_queue,
@@ -1597,10 +1585,7 @@ impl VirtioDevice for Wl {
     fn activate(
         &mut self,
         mem: GuestMemory,
-        interrupt_evt: EventFd,
-        interrupt_resample_evt: EventFd,
-        msix_config: Option<Arc<Mutex<MsixConfig>>>,
-        status: Arc<AtomicUsize>,
+        interrupt: Interrupt,
         mut queues: Vec<Queue>,
         queue_evts: Vec<EventFd>,
     ) {
@@ -1627,10 +1612,7 @@ impl VirtioDevice for Wl {
                     .spawn(move || {
                         Worker::new(
                             mem,
-                            interrupt_evt,
-                            interrupt_resample_evt,
-                            status,
-                            msix_config,
+                            interrupt,
                             queues.remove(0),
                             queues.remove(0),
                             wayland_path,
diff --git a/fuzz/block_fuzzer.rs b/fuzz/block_fuzzer.rs
index b1bc003..1730d49 100644
--- a/fuzz/block_fuzzer.rs
+++ b/fuzz/block_fuzzer.rs
@@ -12,7 +12,7 @@ use std::sync::atomic::AtomicUsize;
 use std::sync::Arc;
 
 use cros_fuzz::fuzz_target;
-use devices::virtio::{Block, Queue, VirtioDevice};
+use devices::virtio::{Block, Interrupt, Queue, VirtioDevice};
 use sys_util::{EventFd, GuestAddress, GuestMemory, SharedMemory};
 
 const MEM_SIZE: u64 = 256 * 1024 * 1024;
@@ -84,10 +84,12 @@ fuzz_target!(|bytes| {
 
     block.activate(
         mem,
-        EventFd::new().unwrap(),
-        EventFd::new().unwrap(),
-        None, // msix_config
-        Arc::new(AtomicUsize::new(0)),
+        Interrupt::new(
+            Arc::new(AtomicUsize::new(0)),
+            EventFd::new().unwrap(),
+            EventFd::new().unwrap(),
+            None, // msix_config
+        ),
         vec![q],
         queue_evts,
     );