Add options for configuring number of vCPUs and CPU affinity
Bug: 197358423
Test: atest MicrodroidHostTestCases
Change-Id: I61a7e746ddd83a1816d18166fb74f4aa5a2565ce
diff --git a/virtualizationservice/aidl/android/system/virtualizationservice/VirtualMachineAppConfig.aidl b/virtualizationservice/aidl/android/system/virtualizationservice/VirtualMachineAppConfig.aidl
index 0cb187c..8265f96 100644
--- a/virtualizationservice/aidl/android/system/virtualizationservice/VirtualMachineAppConfig.aidl
+++ b/virtualizationservice/aidl/android/system/virtualizationservice/VirtualMachineAppConfig.aidl
@@ -52,4 +52,16 @@
* the value in microdroid.json, if any, or the crosvm default.
*/
int memoryMib;
+
+ /**
+ * Number of vCPUs in the VM. Defaults to 1.
+ */
+ int numCpus = 1;
+
+ /**
+ * Comma-separated list of CPUs or CPU ranges to run vCPUs on (e.g. 0,1-3,5), or
+ * colon-separated list of assignments of vCPU to host CPU assignments (e.g. 0=0:1=1:2=2).
+ * Default is no mask which means a vCPU can run on any host CPU.
+ */
+ @nullable String cpuAffinity;
}
diff --git a/virtualizationservice/aidl/android/system/virtualizationservice/VirtualMachineRawConfig.aidl b/virtualizationservice/aidl/android/system/virtualizationservice/VirtualMachineRawConfig.aidl
index c62117e..bb4eef0 100644
--- a/virtualizationservice/aidl/android/system/virtualizationservice/VirtualMachineRawConfig.aidl
+++ b/virtualizationservice/aidl/android/system/virtualizationservice/VirtualMachineRawConfig.aidl
@@ -45,4 +45,16 @@
/** The amount of RAM to give the VM, in MiB. 0 or negative to use the default. */
int memoryMib;
+
+ /**
+ * Number of vCPUs in the VM. Defaults to 1.
+ */
+ int numCpus = 1;
+
+ /**
+ * Comma-separated list of CPUs or CPU ranges to run vCPUs on (e.g. 0,1-3,5), or
+ * colon-separated list of assignments of vCPU to host CPU assignments (e.g. 0=0:1=1:2=2).
+ * Default is no mask which means a vCPU can run on any host CPU.
+ */
+ @nullable String cpuAffinity;
}
diff --git a/virtualizationservice/src/aidl.rs b/virtualizationservice/src/aidl.rs
index 1bd7ee0..c264270 100644
--- a/virtualizationservice/src/aidl.rs
+++ b/virtualizationservice/src/aidl.rs
@@ -266,6 +266,8 @@
params: config.params.to_owned(),
protected,
memory_mib: config.memoryMib.try_into().ok().and_then(NonZeroU32::new),
+ cpus: config.numCpus.try_into().ok().and_then(NonZeroU32::new),
+ cpu_affinity: config.cpuAffinity.clone(),
console_fd,
log_fd,
indirect_files,
@@ -563,6 +565,9 @@
vm_config.memoryMib = config.memoryMib;
}
+ vm_config.numCpus = config.numCpus;
+ vm_config.cpuAffinity = config.cpuAffinity.clone();
+
// Microdroid requires an additional payload disk image and the bootconfig partition.
if os_name == "microdroid" {
add_microdroid_images(
diff --git a/virtualizationservice/src/crosvm.rs b/virtualizationservice/src/crosvm.rs
index bf1ff0c..0b1429c 100644
--- a/virtualizationservice/src/crosvm.rs
+++ b/virtualizationservice/src/crosvm.rs
@@ -45,6 +45,8 @@
pub params: Option<String>,
pub protected: bool,
pub memory_mib: Option<NonZeroU32>,
+ pub cpus: Option<NonZeroU32>,
+ pub cpu_affinity: Option<String>,
pub console_fd: Option<File>,
pub log_fd: Option<File>,
pub indirect_files: Vec<File>,
@@ -246,6 +248,14 @@
command.arg("--mem").arg(memory_mib.to_string());
}
+ if let Some(cpus) = config.cpus {
+ command.arg("--cpus").arg(cpus.to_string());
+ }
+
+ if let Some(cpu_affinity) = config.cpu_affinity {
+ command.arg("--cpu-affinity").arg(cpu_affinity);
+ }
+
// Keep track of what file descriptors should be mapped to the crosvm process.
let mut preserved_fds = config.indirect_files.iter().map(|file| file.as_raw_fd()).collect();