vmm: config: Validate that vCPUs is sufficient for MQ queue count

Fixes: #2563

Signed-off-by: Rob Bradford <robert.bradford@intel.com>
This commit is contained in:
Rob Bradford
2021-04-29 12:10:44 +01:00
committed by Sebastien Boeuf
parent 2ad615cd32
commit 7e0ccce225
2 changed files with 53 additions and 12 deletions
+31 -3
View File
@@ -126,6 +126,8 @@ pub enum ValidationError {
// CPU Hotplug not permitted with TDX
#[cfg(feature = "tdx")]
TdxNoCpuHotplug,
// Insuffient vCPUs for queues
TooManyQueues,
}
type ValidationResult<T> = std::result::Result<T, ValidationError>;
@@ -166,6 +168,9 @@ impl fmt::Display for ValidationError {
TdxNoCpuHotplug => {
write!(f, "CPU hotplug not possible with TDX")
}
TooManyQueues => {
write!(f, "Number of vCPUs is insufficient for number of queues")
}
}
}
}
@@ -863,6 +868,14 @@ impl DiskConfig {
disable_io_uring,
})
}
pub fn validate(&self, vm_config: &VmConfig) -> ValidationResult<()> {
if self.num_queues > vm_config.cpus.boot_vcpus as usize {
return Err(ValidationError::TooManyQueues);
}
Ok(())
}
}
#[derive(Clone, Debug, PartialEq, Deserialize, Serialize)]
@@ -1075,11 +1088,10 @@ impl NetConfig {
fds,
rate_limiter_config,
};
config.validate().map_err(Error::Validation)?;
Ok(config)
}
pub fn validate(&self) -> ValidationResult<()> {
pub fn validate(&self, vm_config: &VmConfig) -> ValidationResult<()> {
if self.num_queues < 2 {
return Err(ValidationError::VnetQueueLowerThan2);
}
@@ -1096,6 +1108,10 @@ impl NetConfig {
}
}
if (self.num_queues / 2) > vm_config.cpus.boot_vcpus as usize {
return Err(ValidationError::TooManyQueues);
}
Ok(())
}
}
@@ -1264,6 +1280,14 @@ impl FsConfig {
id,
})
}
pub fn validate(&self, vm_config: &VmConfig) -> ValidationResult<()> {
if self.num_queues > vm_config.cpus.boot_vcpus as usize {
return Err(ValidationError::TooManyQueues);
}
Ok(())
}
}
#[derive(Clone, Debug, PartialEq, Deserialize, Serialize, Default)]
@@ -1719,6 +1743,7 @@ impl VmConfig {
if disk.vhost_user && disk.vhost_socket.is_none() {
return Err(ValidationError::VhostUserMissingSocket);
}
disk.validate(self)?;
}
}
@@ -1727,7 +1752,7 @@ impl VmConfig {
if net.vhost_user && !self.memory.shared {
return Err(ValidationError::VhostUserRequiresSharedMemory);
}
net.validate()?;
net.validate(self)?;
}
}
@@ -1735,6 +1760,9 @@ impl VmConfig {
if !fses.is_empty() && !self.memory.shared {
return Err(ValidationError::VhostUserRequiresSharedMemory);
}
for fs in fses {
fs.validate(self)?;
}
}
if let Some(t) = &self.cpus.topology {