From eb6daa2fc3d7ee2e95c629f7590de1f3f3868d26 Mon Sep 17 00:00:00 2001 From: Sebastien Boeuf Date: Fri, 22 Apr 2022 11:08:29 +0200 Subject: [PATCH] pci: Store MSI interrupt manager in VfioCommon Extend VfioCommon structure to own the MSI interrupt manager. This will be useful for implementing the restore code path. Signed-off-by: Sebastien Boeuf --- pci/src/vfio.rs | 38 +++++++++++++------------------------- pci/src/vfio_user.rs | 5 +++-- vmm/src/device_manager.rs | 4 ++-- 3 files changed, 18 insertions(+), 29 deletions(-) diff --git a/pci/src/vfio.rs b/pci/src/vfio.rs index d520ab499..e2404f0d3 100644 --- a/pci/src/vfio.rs +++ b/pci/src/vfio.rs @@ -355,6 +355,7 @@ pub(crate) struct VfioCommon { pub(crate) configuration: PciConfiguration, pub(crate) mmio_regions: Vec, pub(crate) interrupt: Interrupt, + pub(crate) msi_interrupt_manager: Arc>, } impl VfioCommon { @@ -595,14 +596,9 @@ impl VfioCommon { } } - pub(crate) fn initialize_msix( - &mut self, - msix_cap: MsixCap, - cap_offset: u32, - interrupt_manager: &Arc>, - bdf: PciBdf, - ) { - let interrupt_source_group = interrupt_manager + pub(crate) fn initialize_msix(&mut self, msix_cap: MsixCap, cap_offset: u32, bdf: PciBdf) { + let interrupt_source_group = self + .msi_interrupt_manager .create_group(MsiIrqGroupConfig { base: 0, count: msix_cap.table_size() as InterruptIndex, @@ -627,13 +623,9 @@ impl VfioCommon { vfio_wrapper.read_config_word((cap + 2).into()) } - pub(crate) fn initialize_msi( - &mut self, - msg_ctl: u16, - cap_offset: u32, - interrupt_manager: &Arc>, - ) { - let interrupt_source_group = interrupt_manager + pub(crate) fn initialize_msi(&mut self, msg_ctl: u16, cap_offset: u32) { + let interrupt_source_group = self + .msi_interrupt_manager .create_group(MsiIrqGroupConfig { base: 0, count: msi_num_enabled_vectors(msg_ctl) as InterruptIndex, @@ -649,12 +641,7 @@ impl VfioCommon { }); } - pub(crate) fn parse_capabilities( - &mut self, - interrupt_manager: &Arc>, - vfio_wrapper: &dyn Vfio, - bdf: PciBdf, - ) { + pub(crate) fn parse_capabilities(&mut self, vfio_wrapper: &dyn Vfio, bdf: PciBdf) { let mut cap_next = vfio_wrapper.read_config_byte(PCI_CONFIG_CAPABILITY_OFFSET); while cap_next != 0 { @@ -667,7 +654,7 @@ impl VfioCommon { // Parse capability only if the VFIO device // supports MSI. let msg_ctl = self.parse_msi_capabilities(cap_next, vfio_wrapper); - self.initialize_msi(msg_ctl, cap_next as u32, interrupt_manager); + self.initialize_msi(msg_ctl, cap_next as u32); } } } @@ -677,7 +664,7 @@ impl VfioCommon { // Parse capability only if the VFIO device // supports MSI-X. let msix_cap = self.parse_msix_capabilities(cap_next, vfio_wrapper); - self.initialize_msix(msix_cap, cap_next as u32, interrupt_manager, bdf); + self.initialize_msix(msix_cap, cap_next as u32, bdf); } } } @@ -1009,7 +996,7 @@ impl VfioPciDevice { vm: &Arc, device: VfioDevice, container: Arc, - msi_interrupt_manager: &Arc>, + msi_interrupt_manager: Arc>, legacy_interrupt_group: Option>, iommu_attached: bool, bdf: PciBdf, @@ -1040,9 +1027,10 @@ impl VfioPciDevice { msi: None, msix: None, }, + msi_interrupt_manager, }; - common.parse_capabilities(msi_interrupt_manager, &vfio_wrapper, bdf); + common.parse_capabilities(&vfio_wrapper, bdf); common.initialize_legacy_interrupt(legacy_interrupt_group, &vfio_wrapper)?; let vfio_pci_device = VfioPciDevice { diff --git a/pci/src/vfio_user.rs b/pci/src/vfio_user.rs index 0b5058935..3c7695cd8 100644 --- a/pci/src/vfio_user.rs +++ b/pci/src/vfio_user.rs @@ -66,7 +66,7 @@ impl VfioUserPciDevice { id: String, vm: &Arc, client: Arc>, - msi_interrupt_manager: &Arc>, + msi_interrupt_manager: Arc>, legacy_interrupt_group: Option>, bdf: PciBdf, ) -> Result { @@ -104,9 +104,10 @@ impl VfioUserPciDevice { msi: None, msix: None, }, + msi_interrupt_manager, }; - common.parse_capabilities(msi_interrupt_manager, &vfio_wrapper, bdf); + common.parse_capabilities(&vfio_wrapper, bdf); common .initialize_legacy_interrupt(legacy_interrupt_group, &vfio_wrapper) .map_err(VfioUserPciDeviceError::InitializeLegacyInterrupts)?; diff --git a/vmm/src/device_manager.rs b/vmm/src/device_manager.rs index 9dd9bfefd..7bff3962e 100644 --- a/vmm/src/device_manager.rs +++ b/vmm/src/device_manager.rs @@ -3181,7 +3181,7 @@ impl DeviceManager { &self.address_manager.vm, vfio_device, vfio_container, - &self.msi_interrupt_manager, + self.msi_interrupt_manager.clone(), legacy_interrupt_group, device_cfg.iommu, pci_device_bdf, @@ -3339,7 +3339,7 @@ impl DeviceManager { vfio_user_name.clone(), &self.address_manager.vm, client.clone(), - &self.msi_interrupt_manager, + self.msi_interrupt_manager.clone(), legacy_interrupt_group, pci_device_bdf, )