diff options
author | Zide Chen <zide.chen@intel.corp-partner.google.com> | 2019-10-15 14:32:23 -0700 |
---|---|---|
committer | Commit Bot <commit-bot@chromium.org> | 2019-10-25 23:59:45 +0000 |
commit | 8a7e4e902a4950b060ea23b40c0dfce7bfa1b2cb (patch) | |
tree | 67764e974ad0e28021f7e7352ab6e1e759e650cc /devices/src/virtio/p9.rs | |
parent | 3185ae95dd58f556a836f9e146dfe7b8450749b2 (diff) | |
download | crosvm-8a7e4e902a4950b060ea23b40c0dfce7bfa1b2cb.tar crosvm-8a7e4e902a4950b060ea23b40c0dfce7bfa1b2cb.tar.gz crosvm-8a7e4e902a4950b060ea23b40c0dfce7bfa1b2cb.tar.bz2 crosvm-8a7e4e902a4950b060ea23b40c0dfce7bfa1b2cb.tar.lz crosvm-8a7e4e902a4950b060ea23b40c0dfce7bfa1b2cb.tar.xz crosvm-8a7e4e902a4950b060ea23b40c0dfce7bfa1b2cb.tar.zst crosvm-8a7e4e902a4950b060ea23b40c0dfce7bfa1b2cb.zip |
devices: implement dedicated Interrupt struct for virtio Worker
The code to inject interrupt to the guest can be generic to all virtio devices. This patch: - move those guest interrupt related fields out of Worker structure and put in a separate file, making the worker code cleaner. - remove redandant functions across virtio devices: signal_used_queue(), signal_config_changed(), etc. BUG=chromium:854765 TEST=sanity test on eve and Linux TEST=cargo test -p devices Change-Id: I8e9f760f2057f192fdc74d16a59fea2e6b08c194 Signed-off-by: Zide Chen <zide.chen@intel.corp-partner.google.com> Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/crosvm/+/1869553 Reviewed-by: Daniel Verkamp <dverkamp@chromium.org> Tested-by: Daniel Verkamp <dverkamp@chromium.org> Tested-by: kokoro <noreply+kokoro@google.com> Commit-Queue: Daniel Verkamp <dverkamp@chromium.org>
Diffstat (limited to 'devices/src/virtio/p9.rs')
-rw-r--r-- | devices/src/virtio/p9.rs | 35 |
1 files changed, 13 insertions, 22 deletions
diff --git a/devices/src/virtio/p9.rs b/devices/src/virtio/p9.rs index 83aa84e..d891d22 100644 --- a/devices/src/virtio/p9.rs +++ b/devices/src/virtio/p9.rs @@ -8,7 +8,7 @@ use std::mem; use std::os::unix::io::RawFd; use std::path::{Path, PathBuf}; use std::result; -use std::sync::atomic::{AtomicUsize, Ordering}; +use std::sync::atomic::AtomicUsize; use std::sync::Arc; use std::thread; use sync::Mutex; @@ -19,8 +19,7 @@ use sys_util::{error, warn, Error as SysError, EventFd, GuestMemory, PollContext use virtio_sys::vhost::VIRTIO_F_VERSION_1; use super::{ - copy_config, DescriptorError, Queue, Reader, VirtioDevice, Writer, INTERRUPT_STATUS_USED_RING, - TYPE_9P, + copy_config, DescriptorError, Interrupt, Queue, Reader, VirtioDevice, Writer, TYPE_9P, }; const QUEUE_SIZE: u16 = 128; @@ -89,21 +88,13 @@ impl Display for P9Error { pub type P9Result<T> = result::Result<T, P9Error>; struct Worker { + interrupt: Interrupt, mem: GuestMemory, queue: Queue, server: p9::Server, - irq_status: Arc<AtomicUsize>, - irq_evt: EventFd, - interrupt_resample_evt: EventFd, } impl Worker { - fn signal_used_queue(&self) -> P9Result<()> { - self.irq_status - .fetch_or(INTERRUPT_STATUS_USED_RING as usize, Ordering::SeqCst); - self.irq_evt.write(1).map_err(P9Error::SignalUsedQueue) - } - fn process_queue(&mut self) -> P9Result<()> { while let Some(avail_desc) = self.queue.pop(&self.mem) { let mut reader = Reader::new(&self.mem, avail_desc.clone()) @@ -119,7 +110,7 @@ impl Worker { .add_used(&self.mem, avail_desc.index, writer.bytes_written() as u32); } - self.signal_used_queue()?; + self.interrupt.signal_used_queue(self.queue.vector); Ok(()) } @@ -137,7 +128,7 @@ impl Worker { let poll_ctx: PollContext<Token> = PollContext::build_with(&[ (&queue_evt, Token::QueueReady), - (&self.interrupt_resample_evt, Token::InterruptResample), + (self.interrupt.get_resample_evt(), Token::InterruptResample), (&kill_evt, Token::Kill), ]) .map_err(P9Error::CreatePollContext)?; @@ -151,10 +142,7 @@ impl Worker { self.process_queue()?; } Token::InterruptResample => { - let _ = self.interrupt_resample_evt.read(); - if self.irq_status.load(Ordering::SeqCst) != 0 { - self.irq_evt.write(1).unwrap(); - } + self.interrupt.interrupt_resample(); } Token::Kill => return Ok(()), } @@ -241,7 +229,7 @@ impl VirtioDevice for P9 { guest_mem: GuestMemory, interrupt_evt: EventFd, interrupt_resample_evt: EventFd, - _msix_config: Option<Arc<Mutex<MsixConfig>>>, + msix_config: Option<Arc<Mutex<MsixConfig>>>, status: Arc<AtomicUsize>, mut queues: Vec<Queue>, mut queue_evts: Vec<EventFd>, @@ -265,12 +253,15 @@ 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, + ), mem: guest_mem, queue: queues.remove(0), server, - irq_status: status, - irq_evt: interrupt_evt, - interrupt_resample_evt, }; worker.run(queue_evts.remove(0), kill_evt) |