From 6566c739e1c1e2a68704a32db317059f9623ac89 Mon Sep 17 00:00:00 2001 From: Sebastien Boeuf Date: Fri, 4 Oct 2019 10:47:13 -0700 Subject: [PATCH] vm-virtio: Add IOMMU support to virtio-vsock Adding virtio feature VIRTIO_F_IOMMU_PLATFORM when explicitly asked by the user. The need for this feature is to be able to attach the virtio device to a virtual IOMMU. Signed-off-by: Sebastien Boeuf --- vm-virtio/src/vsock/device.rs | 10 +++++++--- vm-virtio/src/vsock/mod.rs | 2 +- vmm/src/device_manager.rs | 2 +- 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/vm-virtio/src/vsock/device.rs b/vm-virtio/src/vsock/device.rs index d0eb9fe9e..0609d7a23 100644 --- a/vm-virtio/src/vsock/device.rs +++ b/vm-virtio/src/vsock/device.rs @@ -41,7 +41,7 @@ use crate::Error as DeviceError; use crate::VirtioInterrupt; use crate::{ ActivateError, ActivateResult, DeviceEventT, Queue, VirtioDevice, VirtioDeviceType, - VirtioInterruptType, VIRTIO_F_IN_ORDER, VIRTIO_F_VERSION_1, + VirtioInterruptType, VIRTIO_F_IN_ORDER, VIRTIO_F_IOMMU_PLATFORM, VIRTIO_F_VERSION_1, }; use byteorder::{ByteOrder, LittleEndian}; use vm_memory::GuestMemoryMmap; @@ -366,8 +366,12 @@ where { /// Create a new virtio-vsock device with the given VM CID and vsock /// backend. - pub fn new(cid: u64, backend: B) -> io::Result> { - let avail_features = 1u64 << VIRTIO_F_VERSION_1 | 1u64 << VIRTIO_F_IN_ORDER; + pub fn new(cid: u64, backend: B, iommu: bool) -> io::Result> { + let mut avail_features = 1u64 << VIRTIO_F_VERSION_1 | 1u64 << VIRTIO_F_IN_ORDER; + + if iommu { + avail_features |= 1u64 << VIRTIO_F_IOMMU_PLATFORM; + } Ok(Vsock { cid, diff --git a/vm-virtio/src/vsock/mod.rs b/vm-virtio/src/vsock/mod.rs index db0b1f831..c5c343479 100644 --- a/vm-virtio/src/vsock/mod.rs +++ b/vm-virtio/src/vsock/mod.rs @@ -256,7 +256,7 @@ mod tests { cid: CID, mem: GuestMemoryMmap::new(&[(GuestAddress(0), MEM_SIZE)]).unwrap(), mem_size: MEM_SIZE, - device: Vsock::new(CID, TestBackend::new()).unwrap(), + device: Vsock::new(CID, TestBackend::new(), false).unwrap(), } } diff --git a/vmm/src/device_manager.rs b/vmm/src/device_manager.rs index 9855fb846..3f53ee65e 100644 --- a/vmm/src/device_manager.rs +++ b/vmm/src/device_manager.rs @@ -860,7 +860,7 @@ impl DeviceManager { vm_virtio::vsock::VsockUnixBackend::new(vsock_cfg.cid, socket_path.to_string()) .map_err(DeviceManagerError::CreateVsockBackend)?; - let vsock_device = vm_virtio::Vsock::new(vsock_cfg.cid, backend) + let vsock_device = vm_virtio::Vsock::new(vsock_cfg.cid, backend, false) .map_err(DeviceManagerError::CreateVirtioVsock)?; devices.push(Box::new(vsock_device) as Box);