From d0820cc026ce6c93ef7423df544239f6b1a6dad8 Mon Sep 17 00:00:00 2001 From: Sebastien Boeuf Date: Wed, 4 Mar 2020 15:54:42 +0100 Subject: [PATCH] vmm: Make add_vfio_device mutable The method add_vfio_device() from the DeviceManager needs to be mutable if we want later to be able to update some internal fields from the DeviceManager from this same function. This commit simply takes care of making the necessary changes to change this function as mutable. Signed-off-by: Sebastien Boeuf --- vmm/src/device_manager.rs | 17 +++++++++++------ vmm/src/vm.rs | 16 ++++++++++++++-- 2 files changed, 25 insertions(+), 8 deletions(-) diff --git a/vmm/src/device_manager.rs b/vmm/src/device_manager.rs index 23b6ce5ab..2c5b0cc56 100644 --- a/vmm/src/device_manager.rs +++ b/vmm/src/device_manager.rs @@ -1387,7 +1387,7 @@ impl DeviceManager { #[cfg(feature = "pci_support")] fn add_vfio_device( - &self, + &mut self, pci: &mut PciBus, interrupt_manager: &Arc>, device_fd: &Arc, @@ -1461,8 +1461,9 @@ impl DeviceManager { interrupt_manager: &Arc>, ) -> DeviceManagerResult> { let mut iommu_attached_device_ids = Vec::new(); + let devices = self.config.lock().unwrap().devices.clone(); - if let Some(device_list_cfg) = &self.config.lock().unwrap().devices { + if let Some(device_list_cfg) = &devices { // Create the KVM VFIO device let device_fd = DeviceManager::create_kvm_device(&self.address_manager.vm_fd)?; let device_fd = Arc::new(device_fd); @@ -1670,8 +1671,8 @@ impl DeviceManager { iommu: false, }; - let mut pci = if let Some(pci_bus) = &self.pci_bus { - pci_bus.lock().unwrap() + let pci = if let Some(pci_bus) = &self.pci_bus { + Arc::clone(&pci_bus) } else { return Err(DeviceManagerError::NoPciBus); }; @@ -1690,8 +1691,12 @@ impl DeviceManager { device_fd }; - let device_id = - self.add_vfio_device(&mut pci, &interrupt_manager, &device_fd, &device_cfg)?; + let device_id = self.add_vfio_device( + &mut pci.lock().unwrap(), + &interrupt_manager, + &device_fd, + &device_cfg, + )?; // Update the PCIU bitmap self.pci_devices_up |= 1 << (device_id >> 3); diff --git a/vmm/src/vm.rs b/vmm/src/vm.rs index aa442a5ba..e919f1d14 100755 --- a/vmm/src/vm.rs +++ b/vmm/src/vm.rs @@ -621,7 +621,13 @@ impl Vm { .start_boot_vcpus(entry_addr) .map_err(Error::CpuManager)?; - if self.device_manager.lock().unwrap().console().input_enabled() { + if self + .device_manager + .lock() + .unwrap() + .console() + .input_enabled() + { let console = self.device_manager.lock().unwrap().console().clone(); let signals = Signals::new(&[SIGWINCH, SIGINT, SIGTERM]); match signals { @@ -660,7 +666,13 @@ impl Vm { .read_raw(&mut out) .map_err(Error::Console)?; - if self.device_manager.lock().unwrap().console().input_enabled() { + if self + .device_manager + .lock() + .unwrap() + .console() + .input_enabled() + { self.device_manager .lock() .unwrap()