diff options
author | Xiong Zhang <xiong.y.zhang@intel.corp-partner.google.com> | 2019-09-17 14:17:19 -0700 |
---|---|---|
committer | Commit Bot <commit-bot@chromium.org> | 2019-10-24 20:46:41 +0000 |
commit | a5d248c86382a255c84a2592db67f6ef9887b2a1 (patch) | |
tree | fc6ce6e5f91dbc69ea678baa85ebd1182fa2b1b7 /src/linux.rs | |
parent | d6be9614baea746efbc2744d7a914c95e315ea63 (diff) | |
download | crosvm-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.rs | 19 |
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, |