diff --git a/vm-virtio/src/iommu.rs b/vm-virtio/src/iommu.rs index bd60bddf5..612a087f6 100644 --- a/vm-virtio/src/iommu.rs +++ b/vm-virtio/src/iommu.rs @@ -793,6 +793,7 @@ impl DmaRemapping for IommuMapping { } pub struct Iommu { + id: String, kill_evt: Option, pause_evt: Option, avail_features: u64, @@ -808,7 +809,7 @@ pub struct Iommu { } impl Iommu { - pub fn new() -> io::Result<(Self, Arc)> { + pub fn new(id: String) -> io::Result<(Self, Arc)> { let config = VirtioIommuConfig { page_size_mask: VIRTIO_IOMMU_PAGE_SIZE_MASK, probe_size: PROBE_PROP_SIZE, @@ -822,6 +823,7 @@ impl Iommu { Ok(( Iommu { + id, kill_evt: None, pause_evt: None, avail_features: 1u64 << VIRTIO_F_VERSION_1 @@ -1039,6 +1041,10 @@ impl VirtioDevice for Iommu { } virtio_pausable!(Iommu); -impl Snapshottable for Iommu {} +impl Snapshottable for Iommu { + fn id(&self) -> String { + self.id.clone() + } +} impl Transportable for Iommu {} impl Migratable for Iommu {} diff --git a/vmm/src/device_manager.rs b/vmm/src/device_manager.rs index 06287b67a..2bb35f7ca 100644 --- a/vmm/src/device_manager.rs +++ b/vmm/src/device_manager.rs @@ -788,9 +788,11 @@ impl DeviceManager { Arc::clone(&self.address_manager) as Arc, ); + let iommu_id = String::from(IOMMU_DEVICE_NAME); + let (iommu_device, iommu_mapping) = if self.config.lock().unwrap().iommu { - let (device, mapping) = - vm_virtio::Iommu::new().map_err(DeviceManagerError::CreateVirtioIommu)?; + let (device, mapping) = vm_virtio::Iommu::new(iommu_id.clone()) + .map_err(DeviceManagerError::CreateVirtioIommu)?; let device = Arc::new(Mutex::new(device)); self.iommu_device = Some(Arc::clone(&device)); (Some(device), Some(mapping)) @@ -841,7 +843,7 @@ impl DeviceManager { &mut pci_bus, &None, &interrupt_manager, - Some(String::from(IOMMU_DEVICE_NAME)), + Some(iommu_id), )?; }