From ee1899c6f6954a6e5dec1a710e0617ea537b9890 Mon Sep 17 00:00:00 2001 From: Sebastien Boeuf Date: Fri, 4 Oct 2019 10:36:47 -0700 Subject: [PATCH] vm-virtio: Add IOMMU support to virtio-pmem 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/pmem.rs | 12 +++++++++--- vmm/src/device_manager.rs | 2 +- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/vm-virtio/src/pmem.rs b/vm-virtio/src/pmem.rs index c1f5cb93c..940d89626 100644 --- a/vm-virtio/src/pmem.rs +++ b/vm-virtio/src/pmem.rs @@ -21,7 +21,7 @@ use std::thread; use super::Error as DeviceError; use super::{ ActivateError, ActivateResult, DescriptorChain, DeviceEventT, Queue, VirtioDevice, - VirtioDeviceType, VIRTIO_F_VERSION_1, + VirtioDeviceType, VIRTIO_F_IOMMU_PLATFORM, VIRTIO_F_VERSION_1, }; use crate::{VirtioInterrupt, VirtioInterruptType}; use vm_memory::{ @@ -296,16 +296,22 @@ pub struct Pmem { } impl Pmem { - pub fn new(disk: File, addr: GuestAddress, size: GuestUsize) -> io::Result { + pub fn new(disk: File, addr: GuestAddress, size: GuestUsize, iommu: bool) -> io::Result { let config = VirtioPmemConfig { start: addr.raw_value().to_le(), size: size.to_le(), }; + let mut avail_features = 1u64 << VIRTIO_F_VERSION_1; + + if iommu { + avail_features |= 1u64 << VIRTIO_F_IOMMU_PLATFORM; + } + Ok(Pmem { kill_evt: None, disk: Some(disk), - avail_features: 1u64 << VIRTIO_F_VERSION_1, + avail_features, acked_features: 0u64, config, queue_evts: None, diff --git a/vmm/src/device_manager.rs b/vmm/src/device_manager.rs index 21029fdb5..5120cfdbc 100644 --- a/vmm/src/device_manager.rs +++ b/vmm/src/device_manager.rs @@ -789,7 +789,7 @@ impl DeviceManager { *mem_slots += 1; let virtio_pmem_device = - vm_virtio::Pmem::new(file, pmem_guest_addr, size as GuestUsize) + vm_virtio::Pmem::new(file, pmem_guest_addr, size as GuestUsize, false) .map_err(DeviceManagerError::CreateVirtioPmem)?; devices.push(Box::new(virtio_pmem_device) as Box);