vmm: Add support for resizing the memory used by the VM

For now the new memory size is only used after a reboot but support for
hotplugging memory will be added in a later commit.

Signed-off-by: Rob Bradford <robert.bradford@intel.com>
This commit is contained in:
Rob Bradford 2020-01-10 15:52:23 +00:00 committed by Samuel Ortiz
parent 78dcb1862c
commit 82fce5a4e2
4 changed files with 17 additions and 4 deletions

View File

@ -116,6 +116,7 @@ pub struct VmmPingResponse {
#[derive(Clone, Deserialize, Serialize)] #[derive(Clone, Deserialize, Serialize)]
pub struct VmResizeData { pub struct VmResizeData {
pub desired_vcpus: Option<u8>, pub desired_vcpus: Option<u8>,
pub desired_ram: Option<u64>,
} }
pub enum ApiResponsePayload { pub enum ApiResponsePayload {

View File

@ -432,3 +432,5 @@ components:
desired_vcpus: desired_vcpus:
minimum: 1 minimum: 1
type: integer type: integer
desired_ram:
type: integer

View File

@ -330,9 +330,13 @@ impl Vmm {
self.vm_delete() self.vm_delete()
} }
fn vm_resize(&mut self, desired_vcpus: Option<u8>) -> result::Result<(), VmError> { fn vm_resize(
&mut self,
desired_vcpus: Option<u8>,
desired_ram: Option<u64>,
) -> result::Result<(), VmError> {
if let Some(ref mut vm) = self.vm { if let Some(ref mut vm) = self.vm {
vm.resize(desired_vcpus) vm.resize(desired_vcpus, desired_ram)
} else { } else {
Err(VmError::VmNotRunning) Err(VmError::VmNotRunning)
} }
@ -485,7 +489,10 @@ impl Vmm {
} }
ApiRequest::VmResize(resize_data, sender) => { ApiRequest::VmResize(resize_data, sender) => {
let response = self let response = self
.vm_resize(resize_data.desired_vcpus) .vm_resize(
resize_data.desired_vcpus,
resize_data.desired_ram,
)
.map_err(ApiError::VmResize) .map_err(ApiError::VmResize)
.map(|_| ApiResponsePayload::Empty); .map(|_| ApiResponsePayload::Empty);
sender.send(response).map_err(Error::ApiResponseSend)?; sender.send(response).map_err(Error::ApiResponseSend)?;

View File

@ -482,7 +482,7 @@ impl Vm {
Ok(()) Ok(())
} }
pub fn resize(&mut self, desired_vcpus: Option<u8>) -> Result<()> { pub fn resize(&mut self, desired_vcpus: Option<u8>, desired_memory: Option<u64>) -> Result<()> {
if let Some(desired_vcpus) = desired_vcpus { if let Some(desired_vcpus) = desired_vcpus {
self.cpu_manager self.cpu_manager
.lock() .lock()
@ -495,6 +495,9 @@ impl Vm {
self.config.lock().unwrap().cpus.boot_vcpus = desired_vcpus; self.config.lock().unwrap().cpus.boot_vcpus = desired_vcpus;
} }
if let Some(desired_memory) = desired_memory {
self.config.lock().unwrap().memory.size = desired_memory;
}
Ok(()) Ok(())
} }