From e54f8ec8a5945087c35fd5a038efe7f9798302ff Mon Sep 17 00:00:00 2001 From: Sebastien Boeuf Date: Mon, 23 Mar 2020 12:10:26 +0100 Subject: [PATCH] vmm: Update memory through DeviceManager Whenever the VM memory is resized, DeviceManager needs to be notified so that it can subsequently notify each virtio devices about it. Signed-off-by: Sebastien Boeuf --- vmm/src/device_manager.rs | 22 ++++++++++++++++++---- vmm/src/vm.rs | 6 ++++++ 2 files changed, 24 insertions(+), 4 deletions(-) diff --git a/vmm/src/device_manager.rs b/vmm/src/device_manager.rs index 5ab477df0..3d42113d1 100644 --- a/vmm/src/device_manager.rs +++ b/vmm/src/device_manager.rs @@ -53,9 +53,7 @@ use vm_device::interrupt::{ }; use vm_device::{Migratable, MigratableError, Pausable, Snapshotable}; use vm_memory::guest_memory::FileOffset; -#[cfg(feature = "cmos")] -use vm_memory::GuestAddressSpace; -use vm_memory::{Address, GuestAddress, GuestUsize, MmapRegion}; +use vm_memory::{Address, GuestAddress, GuestAddressSpace, GuestUsize, MmapRegion}; #[cfg(feature = "pci_support")] use vm_virtio::transport::VirtioPciDevice; use vm_virtio::transport::VirtioTransport; @@ -256,8 +254,11 @@ pub enum DeviceManagerError { /// Incorrect device ID as it is already used by another device. DeviceIdAlreadyInUse, - // No disk path was specified when one was expected + /// No disk path was specified when one was expected NoDiskPath, + + /// Failed updating guest memory for virtio device. + UpdateMemoryForVirtioDevice(vm_virtio::Error), } pub type DeviceManagerResult = result::Result; @@ -1812,6 +1813,19 @@ impl DeviceManager { self.cmdline_additions.as_slice() } + pub fn update_memory(&self) -> DeviceManagerResult<()> { + let memory = self.memory_manager.lock().unwrap().guest_memory(); + for (virtio_device, _) in self.virtio_devices.iter() { + virtio_device + .lock() + .unwrap() + .update_memory(&memory.memory()) + .map_err(DeviceManagerError::UpdateMemoryForVirtioDevice)?; + } + + Ok(()) + } + pub fn notify_hotplug( &self, _notification_type: HotPlugNotificationFlags, diff --git a/vmm/src/vm.rs b/vmm/src/vm.rs index 25bad505e..327027e01 100755 --- a/vmm/src/vm.rs +++ b/vmm/src/vm.rs @@ -553,6 +553,12 @@ impl Vm { .resize(desired_memory) .map_err(Error::MemoryManager)? { + self.device_manager + .lock() + .unwrap() + .update_memory() + .map_err(Error::DeviceManager)?; + self.device_manager .lock() .unwrap()