From 7ac877cc26c405c65542289a44eeda929b2070a4 Mon Sep 17 00:00:00 2001 From: Rob Bradford Date: Fri, 3 Apr 2026 13:32:07 -0700 Subject: [PATCH] vmm: device_manager: Reuse PciDeviceCommonConfig in MetaVirtioDevice This struct has the same members and it can be reused to reduce complexity now and if other common PCI related fields need to be added in the future. Signed-off-by: Rob Bradford --- vmm/src/device_manager.rs | 109 ++++++++++++++++++++------------------ 1 file changed, 56 insertions(+), 53 deletions(-) diff --git a/vmm/src/device_manager.rs b/vmm/src/device_manager.rs index 12c1e41a5..d32f5b771 100644 --- a/vmm/src/device_manager.rs +++ b/vmm/src/device_manager.rs @@ -132,8 +132,8 @@ use crate::serial_manager::{Error as SerialManagerError, SerialManager}; use crate::vm_config::IvshmemConfig; use crate::vm_config::{ ConsoleOutputMode, DEFAULT_IOMMU_ADDRESS_WIDTH_BITS, DEFAULT_PCI_SEGMENT_APERTURE_WEIGHT, - DeviceConfig, DiskConfig, FsConfig, GenericVhostUserConfig, NetConfig, PmemConfig, - UserDeviceConfig, VdpaConfig, VhostMode, VmConfig, VsockConfig, + DeviceConfig, DiskConfig, FsConfig, GenericVhostUserConfig, NetConfig, PciDeviceCommonConfig, + PmemConfig, UserDeviceConfig, VdpaConfig, VhostMode, VmConfig, VsockConfig, }; use crate::{DEVICE_MANAGER_SNAPSHOT_ID, GuestRegionMmap, PciDeviceInfo, device_node}; @@ -926,12 +926,19 @@ pub enum PciDeviceHandle { #[derive(Clone)] struct MetaVirtioDevice { virtio_device: Arc>, - iommu: bool, - id: String, - pci_segment: u16, + pci_common: PciDeviceCommonConfig, dma_handler: Option>, } +impl MetaVirtioDevice { + fn id(&self) -> &str { + self.pci_common + .id + .as_deref() + .expect("ID should have been assigned before use") + } +} + #[derive(Default)] pub struct AcpiPlatformAddresses { pub pm_timer_address: Option, @@ -1669,24 +1676,25 @@ impl DeviceManager { let mut iommu_attached_devices = Vec::new(); { for handle in self.virtio_devices.clone() { - let mapping: Option> = if handle.iommu { + let mapping: Option> = if handle.pci_common.iommu { self.iommu_mapping.clone() } else { None }; + let id = handle.id().to_owned(); let dev_id = self.add_virtio_pci_device( handle.virtio_device, &mapping, - &handle.id, - handle.pci_segment, + &id, + handle.pci_common.pci_segment, handle.dma_handler, )?; // Track device BDF for Generic Initiator support - self.device_id_to_bdf.insert(handle.id.clone(), dev_id); + self.device_id_to_bdf.insert(id, dev_id); - if handle.iommu { + if handle.pci_common.iommu { iommu_attached_devices.push(dev_id); } } @@ -2417,9 +2425,11 @@ impl DeviceManager { self.virtio_devices.push(MetaVirtioDevice { virtio_device: Arc::clone(&virtio_console_device) as Arc>, - iommu: console_config.iommu, - id: id.clone(), - pci_segment: 0, + pci_common: PciDeviceCommonConfig { + id: Some(id.clone()), + iommu: console_config.iommu, + ..Default::default() + }, dma_handler: None, }); @@ -2913,9 +2923,7 @@ impl DeviceManager { Ok(MetaVirtioDevice { virtio_device, - iommu: disk_cfg.pci_common.iommu, - id, - pci_segment: disk_cfg.pci_common.pci_segment, + pci_common: disk_cfg.pci_common.clone(), dma_handler: None, }) } @@ -3083,9 +3091,7 @@ impl DeviceManager { Ok(MetaVirtioDevice { virtio_device, - iommu: net_cfg.pci_common.iommu, - id, - pci_segment: net_cfg.pci_common.pci_segment, + pci_common: net_cfg.pci_common.clone(), dma_handler: None, }) } @@ -3128,9 +3134,11 @@ impl DeviceManager { self.virtio_devices.push(MetaVirtioDevice { virtio_device: Arc::clone(&virtio_rng_device) as Arc>, - iommu: rng_config.iommu, - id: id.clone(), - pci_segment: 0, + pci_common: PciDeviceCommonConfig { + id: Some(id.clone()), + iommu: rng_config.iommu, + ..Default::default() + }, dma_handler: None, }); @@ -3189,9 +3197,7 @@ impl DeviceManager { Ok(MetaVirtioDevice { virtio_device: Arc::clone(&generic_vhost_user_device) as Arc>, - iommu: false, - id, - pci_segment: generic_vhost_user_cfg.pci_common.pci_segment, + pci_common: generic_vhost_user_cfg.pci_common.clone(), dma_handler: None, }) } else { @@ -3255,9 +3261,7 @@ impl DeviceManager { Ok(MetaVirtioDevice { virtio_device: Arc::clone(&virtio_fs_device) as Arc>, - iommu: false, - id, - pci_segment: fs_cfg.pci_common.pci_segment, + pci_common: fs_cfg.pci_common.clone(), dma_handler: None, }) } else { @@ -3444,9 +3448,7 @@ impl DeviceManager { Ok(MetaVirtioDevice { virtio_device: Arc::clone(&virtio_pmem_device) as Arc>, - iommu: pmem_cfg.pci_common.iommu, - id, - pci_segment: pmem_cfg.pci_common.pci_segment, + pci_common: pmem_cfg.pci_common.clone(), dma_handler: None, }) } @@ -3515,9 +3517,7 @@ impl DeviceManager { Ok(MetaVirtioDevice { virtio_device: Arc::clone(&vsock_device) as Arc>, - iommu: vsock_cfg.pci_common.iommu, - id, - pci_segment: vsock_cfg.pci_common.pci_segment, + pci_common: vsock_cfg.pci_common.clone(), dma_handler: None, }) } @@ -3571,9 +3571,10 @@ impl DeviceManager { self.virtio_devices.push(MetaVirtioDevice { virtio_device: Arc::clone(&virtio_mem_device) as Arc>, - iommu: false, - id: memory_zone_id.clone(), - pci_segment: 0, + pci_common: PciDeviceCommonConfig { + id: Some(memory_zone_id.clone()), + ..Default::default() + }, dma_handler: None, }); @@ -3658,9 +3659,10 @@ impl DeviceManager { self.virtio_devices.push(MetaVirtioDevice { virtio_device: Arc::clone(&virtio_balloon_device) as Arc>, - iommu: false, - id: id.clone(), - pci_segment: 0, + pci_common: PciDeviceCommonConfig { + id: Some(id.clone()), + ..Default::default() + }, dma_handler: None, }); @@ -3697,9 +3699,10 @@ impl DeviceManager { self.virtio_devices.push(MetaVirtioDevice { virtio_device: Arc::clone(&virtio_watchdog_device) as Arc>, - iommu: false, - id: id.clone(), - pci_segment: 0, + pci_common: PciDeviceCommonConfig { + id: Some(id.clone()), + ..Default::default() + }, dma_handler: None, }); @@ -3755,9 +3758,7 @@ impl DeviceManager { Ok(MetaVirtioDevice { virtio_device: vdpa_device as Arc>, - iommu: vdpa_cfg.pci_common.iommu, - id, - pci_segment: vdpa_cfg.pci_common.pci_segment, + pci_common: vdpa_cfg.pci_common.clone(), dma_handler: Some(vdpa_mapping), }) } @@ -4555,7 +4556,7 @@ impl DeviceManager { .map_err(DeviceManagerError::UpdateMemoryForVirtioDevice)?; if let Some(dma_handler) = &handle.dma_handler - && !handle.iommu + && !handle.pci_common.iommu { let gpa = new_region.start_addr().0; let size = new_region.len(); @@ -4994,24 +4995,26 @@ impl DeviceManager { // for instance. self.virtio_devices.push(handle.clone()); - let mapping: Option> = if handle.iommu { + let mapping: Option> = if handle.pci_common.iommu { self.iommu_mapping.clone() } else { None }; + let id = handle.id().to_owned(); let bdf = self.add_virtio_pci_device( handle.virtio_device, &mapping, - &handle.id, - handle.pci_segment, + &id, + handle.pci_common.pci_segment, handle.dma_handler, )?; // Update the PCIU bitmap - self.pci_segments[handle.pci_segment as usize].pci_devices_up |= 1 << bdf.device(); + self.pci_segments[handle.pci_common.pci_segment as usize].pci_devices_up |= + 1 << bdf.device(); - Ok(PciDeviceInfo { id: handle.id, bdf }) + Ok(PciDeviceInfo { id, bdf }) } fn is_iommu_segment(&self, pci_segment_id: u16) -> bool { @@ -5108,7 +5111,7 @@ impl DeviceManager { for handle in &self.virtio_devices { let virtio_device = handle.virtio_device.lock().unwrap(); if let Some(device_counters) = virtio_device.counters() { - counters.insert(handle.id.clone(), device_counters.clone()); + counters.insert(handle.id().to_owned(), device_counters.clone()); } }