summary refs log tree commit diff
path: root/src/linux.rs
diff options
context:
space:
mode:
authorXiong Zhang <xiong.y.zhang@intel.corp-partner.google.com>2019-09-17 14:17:19 -0700
committerCommit Bot <commit-bot@chromium.org>2019-10-24 20:46:41 +0000
commita5d248c86382a255c84a2592db67f6ef9887b2a1 (patch)
treefc6ce6e5f91dbc69ea678baa85ebd1182fa2b1b7 /src/linux.rs
parentd6be9614baea746efbc2744d7a914c95e315ea63 (diff)
downloadcrosvm-a5d248c86382a255c84a2592db67f6ef9887b2a1.tar
crosvm-a5d248c86382a255c84a2592db67f6ef9887b2a1.tar.gz
crosvm-a5d248c86382a255c84a2592db67f6ef9887b2a1.tar.bz2
crosvm-a5d248c86382a255c84a2592db67f6ef9887b2a1.tar.lz
crosvm-a5d248c86382a255c84a2592db67f6ef9887b2a1.tar.xz
crosvm-a5d248c86382a255c84a2592db67f6ef9887b2a1.tar.zst
crosvm-a5d248c86382a255c84a2592db67f6ef9887b2a1.zip
devices: implement MSI control socket
Allocate per device VmMsi msg_socket for communication between virtio
devices and main VM process, which owns the KVM fd and issues ioctl to
KVM for KVM_IRQFD and KVM_SET_GSI_ROUTING.

BUG=chromium:854765
TEST=None

Change-Id: Ie1c81534912eaab7fbf05b5edef7dca343db301c
Signed-off-by: Xiong Zhang <xiong.y.zhang@intel.corp-partner.google.com>
Signed-off-by: Zide Chen <zide.chen@intel.corp-partner.google.com>
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/crosvm/+/1828339
Tested-by: Daniel Verkamp <dverkamp@chromium.org>
Commit-Queue: Stephen Barber <smbarber@chromium.org>
Reviewed-by: Daniel Verkamp <dverkamp@chromium.org>
Diffstat (limited to 'src/linux.rs')
-rw-r--r--src/linux.rs19
1 files changed, 16 insertions, 3 deletions
diff --git a/src/linux.rs b/src/linux.rs
index 6de02e9..31b9d32 100644
--- a/src/linux.rs
+++ b/src/linux.rs
@@ -53,8 +53,9 @@ use vhost;
 use vm_control::{
     BalloonControlCommand, BalloonControlRequestSocket, BalloonControlResponseSocket,
     DiskControlCommand, DiskControlRequestSocket, DiskControlResponseSocket, DiskControlResult,
-    UsbControlSocket, VmControlResponseSocket, VmIrqResponseSocket, VmMemoryControlRequestSocket,
-    VmMemoryControlResponseSocket, VmMemoryRequest, VmMemoryResponse, VmRunMode,
+    UsbControlSocket, VmControlResponseSocket, VmIrqRequest, VmIrqResponse, VmIrqResponseSocket,
+    VmMemoryControlRequestSocket, VmMemoryControlResponseSocket, VmMemoryRequest, VmMemoryResponse,
+    VmRunMode,
 };
 
 use crate::{Config, DiskOption, Executable, TouchDeviceOption};
@@ -935,6 +936,7 @@ fn create_devices(
     vm: &mut Vm,
     resources: &mut SystemAllocator,
     exit_evt: &EventFd,
+    control_sockets: &mut Vec<TaggedControlSocket>,
     wayland_device_socket: VmMemoryControlRequestSocket,
     gpu_device_socket: VmMemoryControlRequestSocket,
     balloon_device_socket: BalloonControlResponseSocket,
@@ -956,7 +958,17 @@ fn create_devices(
     let mut pci_devices = Vec::new();
 
     for stub in stubs {
-        let dev = VirtioPciDevice::new(mem.clone(), stub.dev).map_err(Error::VirtioPciDev)?;
+        let dev = if stub.dev.msix_vectors() > 0 {
+            let (msi_host_socket, msi_device_socket) =
+                msg_socket::pair::<VmIrqResponse, VmIrqRequest>().map_err(Error::CreateSocket)?;
+            control_sockets.push(TaggedControlSocket::VmIrq(msi_host_socket));
+
+            VirtioPciDevice::new(mem.clone(), stub.dev, Some(msi_device_socket))
+                .map_err(Error::VirtioPciDev)?
+        } else {
+            VirtioPciDevice::new(mem.clone(), stub.dev, None).map_err(Error::VirtioPciDev)?
+        };
+
         let dev = Box::new(dev) as Box<dyn PciDevice>;
         pci_devices.push((dev, stub.jail));
     }
@@ -1363,6 +1375,7 @@ pub fn run_config(cfg: Config) -> Result<()> {
                 vm,
                 sys_allocator,
                 exit_evt,
+                &mut control_sockets,
                 wayland_device_socket,
                 gpu_device_socket,
                 balloon_device_socket,