From 6411c3ae422cd73764161f56d51924f4dac2c634 Mon Sep 17 00:00:00 2001 From: Rob Bradford Date: Fri, 31 Jan 2020 11:55:30 +0000 Subject: [PATCH] vmm: device_manager: Use MemoryManager to get guest memory The DeviceManager has a reference to the MemoryManager so use that to get the GuestMemoryMmap rather than the version stored in the VmInfo struct. Signed-off-by: Rob Bradford --- vmm/src/device_manager.rs | 73 ++++++++++++++++----------------------- 1 file changed, 30 insertions(+), 43 deletions(-) diff --git a/vmm/src/device_manager.rs b/vmm/src/device_manager.rs index 7202dbbf9..32a6c7b56 100644 --- a/vmm/src/device_manager.rs +++ b/vmm/src/device_manager.rs @@ -18,7 +18,6 @@ use crate::memory_manager::{Error as MemoryManagerError, MemoryManager}; use crate::vm::VmInfo; #[cfg(feature = "acpi")] use acpi_tables::{aml, aml::Aml}; -use arc_swap::ArcSwap; #[cfg(feature = "acpi")] use arch::layout; use arch::layout::{APIC_START, IOAPIC_SIZE, IOAPIC_START}; @@ -46,7 +45,7 @@ use vm_device::interrupt::InterruptManager; use vm_device::interrupt::{InterruptIndex, PIN_IRQ}; use vm_device::{Migratable, MigratableError, Pausable, Snapshotable}; use vm_memory::guest_memory::FileOffset; -use vm_memory::{Address, GuestAddress, GuestMemoryMmap, GuestUsize, MmapRegion}; +use vm_memory::{Address, GuestAddress, GuestUsize, MmapRegion}; #[cfg(feature = "pci_support")] use vm_virtio::transport::VirtioPciDevice; use vm_virtio::transport::VirtioTransport; @@ -395,14 +394,14 @@ pub struct DeviceManager { migratable_devices: Vec>>, // Memory Manager - _memory_manager: Arc>, + memory_manager: Arc>, } impl DeviceManager { pub fn new( vm_info: &VmInfo, allocator: Arc>, - _memory_manager: Arc>, + memory_manager: Arc>, _exit_evt: &EventFd, reset_evt: &EventFd, ) -> DeviceManagerResult { @@ -475,7 +474,7 @@ impl DeviceManager { #[cfg(feature = "acpi")] address_manager .io_bus - .insert(_memory_manager.clone(), 0xa00, 0x18) + .insert(memory_manager.clone(), 0xa00, 0x18) .map_err(DeviceManagerError::BusError)?; let mut device_manager = DeviceManager { @@ -488,13 +487,11 @@ impl DeviceManager { ged_notification_device: None, config: vm_info.vm_cfg.clone(), migratable_devices, - _memory_manager, + memory_manager, }; - device_manager.add_legacy_devices( - vm_info, - reset_evt.try_clone().map_err(DeviceManagerError::EventFd)?, - )?; + device_manager + .add_legacy_devices(reset_evt.try_clone().map_err(DeviceManagerError::EventFd)?)?; #[cfg(feature = "acpi")] { @@ -554,7 +551,6 @@ impl DeviceManager { let virtio_iommu_attach_dev = self.add_virtio_pci_device( device, - vm_info.memory, vm_info.vm_fd, &mut pci_bus, mapping, @@ -579,7 +575,6 @@ impl DeviceManager { // b/d/f won't match the virtio-iommu device as expected. self.add_virtio_pci_device( Arc::new(Mutex::new(iommu_device)), - vm_info.memory, vm_info.vm_fd, &mut pci_bus, &None, @@ -624,13 +619,7 @@ impl DeviceManager { .unwrap() .allocate_mmio_addresses(None, MMIO_LEN, Some(MMIO_LEN)); if let Some(addr) = mmio_addr { - self.add_virtio_mmio_device( - device, - vm_info.memory, - vm_info.vm_fd, - interrupt_manager, - addr, - )?; + self.add_virtio_mmio_device(device, vm_info.vm_fd, interrupt_manager, addr)?; } else { error!("Unable to allocate MMIO address!"); } @@ -712,11 +701,7 @@ impl DeviceManager { Ok(Some(ged_device)) } - fn add_legacy_devices( - &mut self, - _vm_info: &VmInfo, - reset_evt: EventFd, - ) -> DeviceManagerResult<()> { + fn add_legacy_devices(&mut self, reset_evt: EventFd) -> DeviceManagerResult<()> { // Add a shutdown device (i8042) let i8042 = Arc::new(Mutex::new(devices::legacy::I8042Device::new(reset_evt))); @@ -728,7 +713,15 @@ impl DeviceManager { { // Add a CMOS emulated device use vm_memory::GuestMemory; - let mem_size = _vm_info.memory.load().last_addr().0 + 1; + let mem_size = self + .memory_manager + .lock() + .unwrap() + .guest_memory() + .load() + .last_addr() + .0 + + 1; let mem_below_4g = std::cmp::min(arch::layout::MEM_32BIT_RESERVED_START.0, mem_size); let mem_above_4g = mem_size.saturating_sub(arch::layout::RAM_64BIT_START.0); @@ -1055,7 +1048,7 @@ impl DeviceManager { self._mmap_regions.push(mmap_region); - self._memory_manager + self.memory_manager .lock() .unwrap() .create_userspace_mapping( @@ -1152,7 +1145,7 @@ impl DeviceManager { self._mmap_regions.push(mmap_region); - self._memory_manager + self.memory_manager .lock() .unwrap() .create_userspace_mapping( @@ -1293,7 +1286,7 @@ impl DeviceManager { interrupt_manager: &Arc, ) -> DeviceManagerResult> { let mut mem_slot = self - ._memory_manager + .memory_manager .lock() .unwrap() .allocate_kvm_memory_slot(); @@ -1312,10 +1305,11 @@ impl DeviceManager { // global device ID. let device_id = pci.next_device_id() << 3; + let memory = self.memory_manager.lock().unwrap().guest_memory(); let vfio_device = VfioDevice::new( &device_cfg.path, device_fd.clone(), - vm_info.memory.clone(), + memory.clone(), device_cfg.iommu, ) .map_err(DeviceManagerError::VfioCreate)?; @@ -1324,7 +1318,7 @@ impl DeviceManager { if let Some(iommu) = iommu_device { let vfio_mapping = Arc::new(VfioDmaMapping::new( vfio_device.get_container(), - Arc::clone(vm_info.memory), + memory.clone(), )); iommu_attached_device_ids.push(device_id); @@ -1362,11 +1356,9 @@ impl DeviceManager { } #[cfg(feature = "pci_support")] - #[allow(clippy::too_many_arguments)] fn add_virtio_pci_device( &mut self, virtio_device: Arc>, - memory: &Arc>, vm_fd: &Arc, pci: &mut PciBus, iommu_mapping: &Option>, @@ -1404,8 +1396,9 @@ impl DeviceManager { None }; + let memory = self.memory_manager.lock().unwrap().guest_memory(); let mut virtio_pci_device = VirtioPciDevice::new( - memory.clone(), + memory, virtio_device, msix_num, iommu_mapping_cb, @@ -1451,17 +1444,16 @@ impl DeviceManager { Ok(ret) } - #[allow(clippy::too_many_arguments)] #[cfg(feature = "mmio_support")] fn add_virtio_mmio_device( &mut self, virtio_device: Arc>, - memory: &Arc>, vm_fd: &Arc, interrupt_manager: &Arc, mmio_base: GuestAddress, ) -> DeviceManagerResult<()> { - let mut mmio_device = vm_virtio::transport::MmioDevice::new(memory.clone(), virtio_device) + let memory = self.memory_manager.lock().unwrap().guest_memory(); + let mut mmio_device = vm_virtio::transport::MmioDevice::new(memory, virtio_device) .map_err(DeviceManagerError::VirtioDevice)?; for (i, (event, addr)) in mmio_device.ioeventfds(mmio_base.0).iter().enumerate() { @@ -1593,13 +1585,8 @@ fn create_ged_device(ged_irq: u32) -> Vec { impl Aml for DeviceManager { fn to_aml_bytes(&self) -> Vec { let mut bytes = Vec::new(); - let start_of_device_area = self - ._memory_manager - .lock() - .unwrap() - .start_of_device_area() - .0; - let end_of_device_area = self._memory_manager.lock().unwrap().end_of_device_area().0; + let start_of_device_area = self.memory_manager.lock().unwrap().start_of_device_area().0; + let end_of_device_area = self.memory_manager.lock().unwrap().end_of_device_area().0; let pci_dsdt_data = aml::Device::new( "_SB_.PCI0".into(), vec![