From f685f0e0b2d13a1a9a350bfa696dd19e32e22619 Mon Sep 17 00:00:00 2001 From: Zide Chen Date: Tue, 16 Mar 2021 11:19:28 -0700 Subject: [PATCH] vm-virtio: initialize MSI-X vectors with VIRTIO_MSI_NO_VECTOR In case of the virtio frontend driver doesn't need interupts for certain queue event, it may explicitly write VIRTIO_MSI_NO_VECTOR to the virtio common configuration, or it may doesn't configure the event type vector at all. This patch initializes both MSI-X configuration vector and queue vector with VIRTIO_MSI_NO_VECTOR, so that the backend drivers won't trigger unexpected interrupts to the guest. Signed-off-by: Zide Chen --- virtio-devices/src/lib.rs | 2 -- virtio-devices/src/transport/pci_device.rs | 6 +++--- vm-virtio/src/lib.rs | 2 ++ vm-virtio/src/queue.rs | 6 +++--- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/virtio-devices/src/lib.rs b/virtio-devices/src/lib.rs index 7720adc4c..a36b2eb93 100644 --- a/virtio-devices/src/lib.rs +++ b/virtio-devices/src/lib.rs @@ -75,8 +75,6 @@ const VIRTIO_F_VERSION_1: u32 = 32; const VIRTIO_F_IOMMU_PLATFORM: u32 = 33; const VIRTIO_F_IN_ORDER: u32 = 35; -const VIRTIO_MSI_NO_VECTOR: u16 = 0xffff; - #[derive(Debug)] pub enum ActivateError { EpollCtl(std::io::Error), diff --git a/virtio-devices/src/transport/pci_device.rs b/virtio-devices/src/transport/pci_device.rs index ca9615794..9492671a6 100644 --- a/virtio-devices/src/transport/pci_device.rs +++ b/virtio-devices/src/transport/pci_device.rs @@ -16,7 +16,7 @@ use crate::transport::VirtioTransport; use crate::{ ActivateResult, Queue, VirtioDevice, VirtioDeviceType, VirtioInterrupt, VirtioInterruptType, DEVICE_ACKNOWLEDGE, DEVICE_DRIVER, DEVICE_DRIVER_OK, DEVICE_FAILED, DEVICE_FEATURES_OK, - DEVICE_INIT, VIRTIO_MSI_NO_VECTOR, + DEVICE_INIT, }; use anyhow::anyhow; use libc::EFD_NONBLOCK; @@ -45,7 +45,7 @@ use vm_migration::{ Migratable, MigratableError, Pausable, Snapshot, SnapshotDataSection, Snapshottable, Transportable, }; -use vm_virtio::{queue, VirtioIommuRemapping}; +use vm_virtio::{queue, VirtioIommuRemapping, VIRTIO_MSI_NO_VECTOR}; use vmm_sys_util::{errno::Result, eventfd::EventFd}; #[derive(Debug)] @@ -423,7 +423,7 @@ impl VirtioPciDevice { device_feature_select: 0, driver_feature_select: 0, queue_select: 0, - msix_config: Arc::new(AtomicU16::new(0)), + msix_config: Arc::new(AtomicU16::new(VIRTIO_MSI_NO_VECTOR)), }, msix_config, msix_num, diff --git a/vm-virtio/src/lib.rs b/vm-virtio/src/lib.rs index 0ec64ee56..756ec2307 100644 --- a/vm-virtio/src/lib.rs +++ b/vm-virtio/src/lib.rs @@ -23,6 +23,8 @@ pub use queue::*; pub type VirtioIommuRemapping = Box std::result::Result + Send + Sync>; +pub const VIRTIO_MSI_NO_VECTOR: u16 = 0xffff; + // Types taken from linux/virtio_ids.h #[derive(Copy, Clone, Debug)] #[allow(dead_code)] diff --git a/vm-virtio/src/queue.rs b/vm-virtio/src/queue.rs index e586b2bce..0a1da6064 100644 --- a/vm-virtio/src/queue.rs +++ b/vm-virtio/src/queue.rs @@ -8,7 +8,7 @@ // // SPDX-License-Identifier: Apache-2.0 AND BSD-3-Clause -use crate::VirtioIommuRemapping; +use crate::{VirtioIommuRemapping, VIRTIO_MSI_NO_VECTOR}; use std::cmp::min; use std::convert::TryInto; use std::fmt::{self, Display}; @@ -438,7 +438,7 @@ impl Queue { max_size, size: max_size, ready: false, - vector: 0, + vector: VIRTIO_MSI_NO_VECTOR, desc_table: GuestAddress(0), avail_ring: GuestAddress(0), used_ring: GuestAddress(0), @@ -486,7 +486,7 @@ impl Queue { self.size = self.max_size; self.next_avail = Wrapping(0); self.next_used = Wrapping(0); - self.vector = 0; + self.vector = VIRTIO_MSI_NO_VECTOR; self.desc_table = GuestAddress(0); self.avail_ring = GuestAddress(0); self.used_ring = GuestAddress(0);