virtio-devices, vmm: Register a DMA handler to VirtioPciDevice

Given that some virtio device might need some DMA handling, we provide a
way to store this through the VirtioPciDevice layer, so that it can be
accessed when the PCI device is removed.

Signed-off-by: Sebastien Boeuf <sebastien.boeuf@intel.com>
This commit is contained in:
Sebastien Boeuf
2022-03-10 14:39:38 +01:00
parent 54d63e774c
commit 86bc313f38
2 changed files with 12 additions and 1 deletions

View File

@@ -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<Barrier>,
// Optional DMA handler
dma_handler: Option<Arc<dyn ExternalDmaMapping>>,
}
impl VirtioPciDevice {
@@ -353,6 +357,7 @@ impl VirtioPciDevice {
pci_device_bdf: u32,
activate_evt: EventFd,
use_64bit_bar: bool,
dma_handler: Option<Arc<dyn ExternalDmaMapping>>,
) -> Result<Self> {
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<dyn ExternalDmaMapping>> {
self.dma_handler.as_ref()
}
}
impl VirtioTransport for VirtioPciDevice {