diff --git a/src/main.rs b/src/main.rs index f546d1f74..60f1d3a9f 100755 --- a/src/main.rs +++ b/src/main.rs @@ -135,7 +135,7 @@ fn main() { "Cloud Hypervisor Guest\n\tvCPUs: {}\n\tMemory: {} MB\ \n\tKernel: {:?}\n\tKernel cmdline: {}\n\tDisk(s): {:?}", u8::from(&vm_config.cpus), - vm_config.memory.size, + vm_config.memory.size >> 20, vm_config.kernel.path, vm_config.cmdline.args.as_str(), vm_config.disks, @@ -294,7 +294,7 @@ mod tests { let (disks, fw_path) = prepare_files(); let mut child = Command::new("target/debug/cloud-hypervisor") .args(&["--cpus", "1"]) - .args(&["--memory", "size=512"]) + .args(&["--memory", "size=512M"]) .args(&["--kernel", fw_path.as_str()]) .args(&["--disk", disks[0], disks[1]]) .args(&["--net", "tap=,mac=,ip=192.168.2.1,mask=255.255.255.0"]) @@ -322,7 +322,7 @@ mod tests { let (disks, fw_path) = prepare_files(); let mut child = Command::new("target/debug/cloud-hypervisor") .args(&["--cpus", "2"]) - .args(&["--memory", "size=512"]) + .args(&["--memory", "size=512M"]) .args(&["--kernel", fw_path.as_str()]) .args(&["--disk", disks[0], disks[1]]) .args(&["--net", "tap=,mac=,ip=192.168.2.1,mask=255.255.255.0"]) @@ -347,7 +347,7 @@ mod tests { let (disks, fw_path) = prepare_files(); let mut child = Command::new("target/debug/cloud-hypervisor") .args(&["--cpus", "1"]) - .args(&["--memory", "size=5120"]) + .args(&["--memory", "size=5120M"]) .args(&["--kernel", fw_path.as_str()]) .args(&["--disk", disks[0], disks[1]]) .args(&["--net", "tap=,mac=,ip=192.168.2.1,mask=255.255.255.0"]) @@ -372,7 +372,7 @@ mod tests { let (disks, fw_path) = prepare_files(); let mut child = Command::new("target/debug/cloud-hypervisor") .args(&["--cpus", "1"]) - .args(&["--memory", "size=512"]) + .args(&["--memory", "size=512M"]) .args(&["--kernel", fw_path.as_str()]) .args(&["--disk", disks[0], disks[1]]) .args(&["--net", "tap=,mac=,ip=192.168.2.1,mask=255.255.255.0"]) @@ -410,7 +410,7 @@ mod tests { let mut child = Command::new("target/debug/cloud-hypervisor") .args(&["--cpus", "1"]) - .args(&["--memory", "size=512"]) + .args(&["--memory", "size=512M"]) .args(&["--kernel", kernel_path.to_str().unwrap()]) .args(&["--disk", disks[0], disks[1]]) .args(&["--net", "tap=,mac=,ip=192.168.2.1,mask=255.255.255.0"]) @@ -452,7 +452,7 @@ mod tests { let mut child = Command::new("target/debug/cloud-hypervisor") .args(&["--cpus", "1"]) - .args(&["--memory", "size=512"]) + .args(&["--memory", "size=512M"]) .args(&["--kernel", kernel_path.to_str().unwrap()]) .args(&["--disk", disks[0], disks[1]]) .args(&["--net", "tap=,mac=,ip=192.168.2.1,mask=255.255.255.0"]) @@ -488,7 +488,7 @@ mod tests { let (disks, fw_path) = prepare_files(); let mut child = Command::new("target/debug/cloud-hypervisor") .args(&["--cpus", "1"]) - .args(&["--memory", "size=512"]) + .args(&["--memory", "size=512M"]) .args(&["--kernel", fw_path.as_str()]) .args(&["--disk", disks[0], disks[1]]) .args(&["--net", "tap=,mac=,ip=192.168.2.1,mask=255.255.255.0"]) @@ -535,7 +535,7 @@ mod tests { let mut child = Command::new("target/debug/cloud-hypervisor") .args(&["--cpus", "1"]) - .args(&["--memory", "size=512,file=/dev/shm"]) + .args(&["--memory", "size=512M,file=/dev/shm"]) .args(&["--kernel", kernel_path.to_str().unwrap()]) .args(&["--disk", disks[0], disks[1]]) .args(&["--net", "tap=,mac=,ip=192.168.2.1,mask=255.255.255.0"]) @@ -605,7 +605,7 @@ mod tests { let mut child = Command::new("target/debug/cloud-hypervisor") .args(&["--cpus", "1"]) - .args(&["--memory", "size=512"]) + .args(&["--memory", "size=512M"]) .args(&["--kernel", kernel_path.to_str().unwrap()]) .args(&["--disk", disks[0], disks[1]]) .args(&["--net", "tap=,mac=,ip=192.168.2.1,mask=255.255.255.0"]) @@ -673,7 +673,7 @@ mod tests { let mut child = Command::new("target/debug/cloud-hypervisor") .args(&["--cpus", "1"]) - .args(&["--memory", "size=512"]) + .args(&["--memory", "size=512M"]) .args(&["--kernel", kernel_path.to_str().unwrap()]) .args(&["--disk", disks[1]]) .args(&["--net", "tap=,mac=,ip=192.168.2.1,mask=255.255.255.0"]) diff --git a/vmm/src/config.rs b/vmm/src/config.rs index d207cde19..5cfe2bb50 100644 --- a/vmm/src/config.rs +++ b/vmm/src/config.rs @@ -22,8 +22,6 @@ const CMDLINE_OFFSET: GuestAddress = GuestAddress(0x20000); pub enum Error<'a> { /// Failed parsing cpus parameters. ParseCpusParams(std::num::ParseIntError), - /// Failed parsing memory size parameter. - ParseMemorySizeParam(std::num::ParseIntError), /// Failed parsing memory file parameter. ParseMemoryFileParam, /// Failed parsing kernel parameters. @@ -50,8 +48,8 @@ pub enum Error<'a> { ParseFsQueueSizeParam(std::num::ParseIntError), /// Failed parsing persitent memory file parameter. ParsePmemFileParam, - /// Failed parsing persitent memory size parameter. - ParsePmemSizeParam(std::num::ParseIntError), + /// Failed parsing size parameter. + ParseSizeParam(std::num::ParseIntError), } pub type Result<'a, T> = result::Result>; @@ -67,6 +65,24 @@ pub struct VmParams<'a> { pub pmem: Option>, } +fn parse_size(size: &str) -> Result { + let s = size.trim(); + + let shift = if s.ends_with('K') { + 10 + } else if s.ends_with('M') { + 20 + } else if s.ends_with('G') { + 30 + } else { + 0 + }; + + let s = s.trim_end_matches(|c| c == 'K' || c == 'M' || c == 'G'); + let res = s.parse::().map_err(Error::ParseSizeParam)?; + Ok(res << shift) +} + pub struct CpusConfig(pub u8); impl CpusConfig { @@ -117,9 +133,7 @@ impl<'a> MemoryConfig<'a> { }; Ok(MemoryConfig { - size: size_str - .parse::() - .map_err(Error::ParseMemorySizeParam)?, + size: parse_size(size_str)?, file, }) } @@ -323,7 +337,7 @@ impl<'a> PmemConfig<'a> { Ok(PmemConfig { file: Path::new(file_str), - size: size_str.parse::().map_err(Error::ParsePmemSizeParam)?, + size: parse_size(size_str)?, }) } } diff --git a/vmm/src/vm.rs b/vmm/src/vm.rs index 68c674f30..869fbc4dd 100755 --- a/vmm/src/vm.rs +++ b/vmm/src/vm.rs @@ -924,7 +924,7 @@ impl<'a> Vm<'a> { let fd = Arc::new(fd); // Init guest memory - let arch_mem_regions = arch::arch_memory_regions(config.memory.size << 20); + let arch_mem_regions = arch::arch_memory_regions(config.memory.size); let guest_memory = match config.memory.file { Some(file) => {