diff --git a/virtio-devices/src/transport/pci_device.rs b/virtio-devices/src/transport/pci_device.rs index a6ed0829d..a0772c7cb 100644 --- a/virtio-devices/src/transport/pci_device.rs +++ b/virtio-devices/src/transport/pci_device.rs @@ -31,6 +31,7 @@ use versionize::{VersionMap, Versionize, VersionizeResult}; use versionize_derive::Versionize; use virtio_queue::{Error as QueueError, Queue}; use vm_allocator::{AddressAllocator, SystemAllocator}; +use vm_device::dma_mapping::ExternalDmaMapping; use vm_device::interrupt::{ InterruptIndex, InterruptManager, InterruptSourceGroup, MsiIrqGroupConfig, }; @@ -338,6 +339,9 @@ pub struct VirtioPciDevice { // Barrier that is used to wait on for activation activate_barrier: Arc, + + // Optional DMA handler + dma_handler: Option>, } impl VirtioPciDevice { @@ -353,6 +357,7 @@ impl VirtioPciDevice { pci_device_bdf: u32, activate_evt: EventFd, use_64bit_bar: bool, + dma_handler: Option>, ) -> Result { let device_clone = device.clone(); let mut locked_device = device_clone.lock().unwrap(); @@ -454,6 +459,7 @@ impl VirtioPciDevice { bar_regions: vec![], activate_evt, activate_barrier: Arc::new(Barrier::new(2)), + dma_handler, }; if let Some(msix_config) = &virtio_pci_device.msix_config { @@ -701,6 +707,10 @@ impl VirtioPciDevice { fn needs_activation(&self) -> bool { !self.device_activated.load(Ordering::SeqCst) && self.is_driver_ready() } + + pub fn dma_handler(&self) -> Option<&Arc> { + self.dma_handler.as_ref() + } } impl VirtioTransport for VirtioPciDevice { diff --git a/vmm/src/device_manager.rs b/vmm/src/device_manager.rs index 338d6a348..ac47436c9 100644 --- a/vmm/src/device_manager.rs +++ b/vmm/src/device_manager.rs @@ -3295,7 +3295,7 @@ impl DeviceManager { iommu_mapping: &Option>, virtio_device_id: String, pci_segment_id: u16, - _dma_handler: Option>, + dma_handler: Option>, ) -> DeviceManagerResult { let id = format!("{}-{}", VIRTIO_PCI_DEVICE_NAME_PREFIX, virtio_device_id); @@ -3385,6 +3385,7 @@ impl DeviceManager { // to firmware without requiring excessive identity mapping. // The exception being if not on the default PCI segment. pci_segment_id > 0 || device_type != VirtioDeviceType::Block as u32, + dma_handler, ) .map_err(DeviceManagerError::VirtioDevice)?;