Skip to content

Commit ae0708b

Browse files
committed
add mem_config parameter to machine-config endpoint (aarch64)
Add a mem_config parameter to the PUT/PATCH /machine-config endpoints, which allows configuration of the size of a swiotlb region to use. Signed-off-by: Patrick Roy <[email protected]>
1 parent 16669a8 commit ae0708b

File tree

4 files changed

+44
-1
lines changed

4 files changed

+44
-1
lines changed

src/firecracker/src/api_server/request/machine_configuration.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,7 @@ mod tests {
119119
let expected_config = MachineConfigUpdate {
120120
vcpu_count: Some(8),
121121
mem_size_mib: Some(1024),
122+
mem_config: None,
122123
smt: Some(false),
123124
cpu_template: None,
124125
track_dirty_pages: Some(false),
@@ -140,6 +141,7 @@ mod tests {
140141
let expected_config = MachineConfigUpdate {
141142
vcpu_count: Some(8),
142143
mem_size_mib: Some(1024),
144+
mem_config: None,
143145
smt: Some(false),
144146
cpu_template: Some(StaticCpuTemplate::None),
145147
track_dirty_pages: Some(false),
@@ -161,6 +163,7 @@ mod tests {
161163
let expected_config = MachineConfigUpdate {
162164
vcpu_count: Some(8),
163165
mem_size_mib: Some(1024),
166+
mem_config: None,
164167
smt: Some(false),
165168
cpu_template: None,
166169
track_dirty_pages: Some(true),
@@ -186,6 +189,7 @@ mod tests {
186189
let expected_config = MachineConfigUpdate {
187190
vcpu_count: Some(8),
188191
mem_size_mib: Some(1024),
192+
mem_config: None,
189193
smt: Some(false),
190194
cpu_template: Some(StaticCpuTemplate::T2),
191195
track_dirty_pages: Some(true),
@@ -213,6 +217,7 @@ mod tests {
213217
let expected_config = MachineConfigUpdate {
214218
vcpu_count: Some(8),
215219
mem_size_mib: Some(1024),
220+
mem_config: None,
216221
smt: Some(true),
217222
cpu_template: None,
218223
track_dirty_pages: Some(true),

src/vmm/src/persist.rs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,9 @@ use crate::snapshot::Snapshot;
3232
use crate::utils::u64_to_usize;
3333
use crate::vmm_config::boot_source::BootSourceConfig;
3434
use crate::vmm_config::instance_info::InstanceInfo;
35-
use crate::vmm_config::machine_config::{HugePageConfig, MachineConfigError, MachineConfigUpdate};
35+
use crate::vmm_config::machine_config::{
36+
HugePageConfig, MachineConfigError, MachineConfigUpdate, MemoryConfig,
37+
};
3638
use crate::vmm_config::snapshot::{
3739
CreateSnapshotParams, LoadSnapshotParams, MemBackendType, SnapshotType,
3840
};
@@ -48,6 +50,8 @@ use crate::{EventManager, Vmm, VmmError, mem_size_mib, vstate};
4850
pub struct VmInfo {
4951
/// Guest memory size.
5052
pub mem_size_mib: u64,
53+
/// Memory config
54+
pub mem_config: MemoryConfig,
5155
/// smt information
5256
pub smt: bool,
5357
/// CPU template type
@@ -62,6 +66,7 @@ impl From<&VmResources> for VmInfo {
6266
fn from(value: &VmResources) -> Self {
6367
Self {
6468
mem_size_mib: value.machine_config.mem_size_mib as u64,
69+
mem_config: value.machine_config.mem_config,
6570
smt: value.machine_config.smt,
6671
cpu_template: StaticCpuTemplate::from(&value.machine_config.cpu_template),
6772
boot_source: value.boot_source.config.clone(),
@@ -437,6 +442,7 @@ pub fn restore_from_snapshot(
437442
.update_machine_config(&MachineConfigUpdate {
438443
vcpu_count: Some(vcpu_count),
439444
mem_size_mib: Some(u64_to_usize(microvm_state.vm_info.mem_size_mib)),
445+
mem_config: Some(microvm_state.vm_info.mem_config),
440446
smt: Some(microvm_state.vm_info.smt),
441447
cpu_template: Some(microvm_state.vm_info.cpu_template),
442448
track_dirty_pages: Some(track_dirty_pages),

src/vmm/src/resources.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1325,6 +1325,7 @@ mod tests {
13251325
let mut aux_vm_config = MachineConfigUpdate {
13261326
vcpu_count: Some(32),
13271327
mem_size_mib: Some(512),
1328+
mem_config: None,
13281329
smt: Some(false),
13291330
#[cfg(target_arch = "x86_64")]
13301331
cpu_template: Some(StaticCpuTemplate::T2),

src/vmm/src/vmm_config/machine_config.rs

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,9 @@ pub enum MachineConfigError {
2020
IncompatibleBalloonSize,
2121
/// The memory size (MiB) is either 0, or not a multiple of the configured page size.
2222
InvalidMemorySize,
23+
/// The specified swiotlb region matches or exceeds the total VM memory, or not a multiple of the configured page size.
24+
#[cfg(target_arch = "aarch64")]
25+
InvalidSwiotlbRegionSize,
2326
/// The number of vCPUs must be greater than 0, less than {MAX_SUPPORTED_VCPUS:} and must be 1 or an even number if SMT is enabled.
2427
InvalidVcpuCount,
2528
/// Could not get the configuration of the previously installed balloon device to validate the memory size.
@@ -89,6 +92,17 @@ impl From<HugePageConfig> for Option<memfd::HugetlbSize> {
8992
}
9093
}
9194

95+
/// Structure containing options for tweaking guest memory configuration.
96+
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Deserialize, Serialize)]
97+
pub struct MemoryConfig {
98+
/// The initial size of the swiotlb region. If 0, no swiotlb region will be created.
99+
/// If non-zero, all device will be forced to bounce buffers through a swiotlb region
100+
/// of the specified size that will have been placed into a dedicated kvm memslot.
101+
#[cfg(target_arch = "aarch64")]
102+
#[serde(default)]
103+
pub initial_swiotlb_size: usize,
104+
}
105+
92106
/// Struct used in PUT `/machine-config` API call.
93107
#[derive(Clone, Debug, PartialEq, Eq, Deserialize, Serialize)]
94108
#[serde(deny_unknown_fields)]
@@ -97,6 +111,9 @@ pub struct MachineConfig {
97111
pub vcpu_count: u8,
98112
/// The memory size in MiB.
99113
pub mem_size_mib: usize,
114+
/// Additional configuration options for guest memory
115+
#[serde(default)]
116+
pub mem_config: MemoryConfig,
100117
/// Enables or disabled SMT.
101118
#[serde(default)]
102119
pub smt: bool,
@@ -153,6 +170,7 @@ impl Default for MachineConfig {
153170
Self {
154171
vcpu_count: 1,
155172
mem_size_mib: DEFAULT_MEM_SIZE_MIB,
173+
mem_config: Default::default(),
156174
smt: false,
157175
cpu_template: None,
158176
track_dirty_pages: false,
@@ -178,6 +196,9 @@ pub struct MachineConfigUpdate {
178196
/// The memory size in MiB.
179197
#[serde(default)]
180198
pub mem_size_mib: Option<usize>,
199+
/// The memory configuration
200+
#[serde(default)]
201+
pub mem_config: Option<MemoryConfig>,
181202
/// Enables or disabled SMT.
182203
#[serde(default)]
183204
pub smt: Option<bool>,
@@ -210,6 +231,7 @@ impl From<MachineConfig> for MachineConfigUpdate {
210231
MachineConfigUpdate {
211232
vcpu_count: Some(cfg.vcpu_count),
212233
mem_size_mib: Some(cfg.mem_size_mib),
234+
mem_config: Some(cfg.mem_config),
213235
smt: Some(cfg.smt),
214236
cpu_template: cfg.static_template(),
215237
track_dirty_pages: Some(cfg.track_dirty_pages),
@@ -263,11 +285,19 @@ impl MachineConfig {
263285

264286
let mem_size_mib = update.mem_size_mib.unwrap_or(self.mem_size_mib);
265287
let page_config = update.huge_pages.unwrap_or(self.huge_pages);
288+
let mem_config = update.mem_config.unwrap_or(self.mem_config);
266289

267290
if mem_size_mib == 0 || !page_config.is_valid_mem_size(mem_size_mib) {
268291
return Err(MachineConfigError::InvalidMemorySize);
269292
}
270293

294+
#[cfg(target_arch = "aarch64")]
295+
if mem_config.initial_swiotlb_size >= mem_size_mib
296+
|| !page_config.is_valid_mem_size(mem_config.initial_swiotlb_size)
297+
{
298+
return Err(MachineConfigError::InvalidSwiotlbRegionSize);
299+
}
300+
271301
let cpu_template = match update.cpu_template {
272302
None => self.cpu_template.clone(),
273303
Some(StaticCpuTemplate::None) => None,
@@ -277,6 +307,7 @@ impl MachineConfig {
277307
Ok(MachineConfig {
278308
vcpu_count,
279309
mem_size_mib,
310+
mem_config,
280311
smt,
281312
cpu_template,
282313
track_dirty_pages: update.track_dirty_pages.unwrap_or(self.track_dirty_pages),

0 commit comments

Comments
 (0)