Skip to content

Commit 5f60bcf

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 bb84a59 commit 5f60bcf

File tree

4 files changed

+43
-1
lines changed

4 files changed

+43
-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
@@ -1323,6 +1323,7 @@ mod tests {
13231323
let mut aux_vm_config = MachineConfigUpdate {
13241324
vcpu_count: Some(32),
13251325
mem_size_mib: Some(512),
1326+
mem_config: None,
13261327
smt: Some(false),
13271328
#[cfg(target_arch = "x86_64")]
13281329
cpu_template: Some(StaticCpuTemplate::T2),

src/vmm/src/vmm_config/machine_config.rs

Lines changed: 30 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,16 @@ 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+
pub initial_swiotlb_size: usize,
103+
}
104+
92105
/// Struct used in PUT `/machine-config` API call.
93106
#[derive(Clone, Debug, PartialEq, Eq, Deserialize, Serialize)]
94107
#[serde(deny_unknown_fields)]
@@ -97,6 +110,9 @@ pub struct MachineConfig {
97110
pub vcpu_count: u8,
98111
/// The memory size in MiB.
99112
pub mem_size_mib: usize,
113+
/// Additional configuration options for guest memory
114+
#[serde(default)]
115+
pub mem_config: MemoryConfig,
100116
/// Enables or disabled SMT.
101117
#[serde(default)]
102118
pub smt: bool,
@@ -153,6 +169,7 @@ impl Default for MachineConfig {
153169
Self {
154170
vcpu_count: 1,
155171
mem_size_mib: DEFAULT_MEM_SIZE_MIB,
172+
mem_config: Default::default(),
156173
smt: false,
157174
cpu_template: None,
158175
track_dirty_pages: false,
@@ -178,6 +195,9 @@ pub struct MachineConfigUpdate {
178195
/// The memory size in MiB.
179196
#[serde(default)]
180197
pub mem_size_mib: Option<usize>,
198+
/// The memory configuration
199+
#[serde(default)]
200+
pub mem_config: Option<MemoryConfig>,
181201
/// Enables or disabled SMT.
182202
#[serde(default)]
183203
pub smt: Option<bool>,
@@ -210,6 +230,7 @@ impl From<MachineConfig> for MachineConfigUpdate {
210230
MachineConfigUpdate {
211231
vcpu_count: Some(cfg.vcpu_count),
212232
mem_size_mib: Some(cfg.mem_size_mib),
233+
mem_config: Some(cfg.mem_config),
213234
smt: Some(cfg.smt),
214235
cpu_template: cfg.static_template(),
215236
track_dirty_pages: Some(cfg.track_dirty_pages),
@@ -263,11 +284,19 @@ impl MachineConfig {
263284

264285
let mem_size_mib = update.mem_size_mib.unwrap_or(self.mem_size_mib);
265286
let page_config = update.huge_pages.unwrap_or(self.huge_pages);
287+
let mem_config = update.mem_config.unwrap_or(self.mem_config);
266288

267289
if mem_size_mib == 0 || !page_config.is_valid_mem_size(mem_size_mib) {
268290
return Err(MachineConfigError::InvalidMemorySize);
269291
}
270292

293+
#[cfg(target_arch = "aarch64")]
294+
if mem_config.initial_swiotlb_size >= mem_size_mib
295+
|| !page_config.is_valid_mem_size(mem_config.initial_swiotlb_size)
296+
{
297+
return Err(MachineConfigError::InvalidSwiotlbRegionSize);
298+
}
299+
271300
let cpu_template = match update.cpu_template {
272301
None => self.cpu_template.clone(),
273302
Some(StaticCpuTemplate::None) => None,
@@ -277,6 +306,7 @@ impl MachineConfig {
277306
Ok(MachineConfig {
278307
vcpu_count,
279308
mem_size_mib,
309+
mem_config,
280310
smt,
281311
cpu_template,
282312
track_dirty_pages: update.track_dirty_pages.unwrap_or(self.track_dirty_pages),

0 commit comments

Comments
 (0)