Skip to content

Commit b62cc65

Browse files
committed
refactor: Eliminate unused {Static,Custom}CpuTemplate variants
They were needed for Versionize reasons, but with firecracker-microvm#4230 merged, we can eliminate them, simplifying the code. Signed-off-by: Patrick Roy <[email protected]>
1 parent 9e9dc3f commit b62cc65

File tree

10 files changed

+50
-82
lines changed

10 files changed

+50
-82
lines changed

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,7 @@ mod tests {
127127
vcpu_count: Some(8),
128128
mem_size_mib: Some(1024),
129129
smt: Some(false),
130-
cpu_template: Some(StaticCpuTemplate::None),
130+
cpu_template: Some(None),
131131
track_dirty_pages: Some(false),
132132
};
133133
assert_eq!(
@@ -167,7 +167,7 @@ mod tests {
167167
vcpu_count: Some(8),
168168
mem_size_mib: Some(1024),
169169
smt: Some(false),
170-
cpu_template: Some(StaticCpuTemplate::T2),
170+
cpu_template: Some(Some(StaticCpuTemplate::T2)),
171171
track_dirty_pages: Some(true),
172172
};
173173
assert_eq!(

src/vmm/src/cpu_config/aarch64/custom_cpu_template.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@ impl GetCpuTemplate for Option<CpuTemplateType> {
2424
CpuTemplateType::Static(template) => match template {
2525
// TODO: Check if the CPU model is Neoverse-V1.
2626
StaticCpuTemplate::V1N1 => Ok(Cow::Owned(v1n1::v1n1())),
27-
other => Err(GetCpuTemplateError::InvalidStaticCpuTemplate(*other)),
2827
},
2928
},
3029
None => Ok(Cow::Owned(CustomCpuTemplate::default())),

src/vmm/src/cpu_config/aarch64/static_cpu_templates/mod.rs

Lines changed: 9 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -3,38 +3,31 @@
33

44
use serde::{Deserialize, Serialize};
55

6+
use crate::cpu_config::templates::CpuTemplateType;
7+
68
/// Module with V1N1 CPU template for aarch64
79
pub mod v1n1;
810

911
/// Templates available for configuring the supported ARM CPU types.
10-
#[derive(Debug, Default, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
12+
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
1113
pub enum StaticCpuTemplate {
12-
// Needed for compatibility
13-
/// Empty0
14-
Empty0,
15-
// Needed for compatibility
16-
/// Empty1
17-
Empty1,
1814
/// Template to mask Neoverse-V1 as Neoverse-N1
1915
V1N1,
20-
/// No CPU template is used.
21-
#[default]
22-
None,
2316
}
2417

25-
impl StaticCpuTemplate {
26-
/// Check if no template specified
27-
pub fn is_none(&self) -> bool {
28-
self == &StaticCpuTemplate::None
18+
impl Into<Option<StaticCpuTemplate>> for &CpuTemplateType {
19+
fn into(self) -> Option<StaticCpuTemplate> {
20+
match self {
21+
CpuTemplateType::Custom(_) => None,
22+
CpuTemplateType::Static(template) => Some(*template),
23+
}
2924
}
3025
}
3126

3227
impl std::fmt::Display for StaticCpuTemplate {
3328
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
3429
match self {
3530
StaticCpuTemplate::V1N1 => write!(f, "V1N1"),
36-
StaticCpuTemplate::None => write!(f, "None"),
37-
_ => write!(f, "None"),
3831
}
3932
}
4033
}

src/vmm/src/cpu_config/templates.rs

Lines changed: 0 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -61,28 +61,6 @@ pub enum CpuTemplateType {
6161
Static(StaticCpuTemplate),
6262
}
6363

64-
// This conversion is only used for snapshot, but the static CPU template
65-
// information has not been saved into snapshot since v1.1.
66-
impl From<&Option<CpuTemplateType>> for StaticCpuTemplate {
67-
fn from(value: &Option<CpuTemplateType>) -> Self {
68-
match value {
69-
Some(CpuTemplateType::Static(template)) => *template,
70-
Some(CpuTemplateType::Custom(_)) | None => StaticCpuTemplate::None,
71-
}
72-
}
73-
}
74-
75-
// This conversion is used when converting `&VmConfig` to `MachineConfig` to
76-
// respond `GET /machine-config` and `GET /vm`.
77-
impl From<&CpuTemplateType> for StaticCpuTemplate {
78-
fn from(value: &CpuTemplateType) -> Self {
79-
match value {
80-
CpuTemplateType::Static(template) => *template,
81-
CpuTemplateType::Custom(_) => StaticCpuTemplate::None,
82-
}
83-
}
84-
}
85-
8664
impl<'a> TryFrom<&'a [u8]> for CustomCpuTemplate {
8765
type Error = serde_json::Error;
8866

src/vmm/src/cpu_config/x86_64/custom_cpu_template.rs

Lines changed: 0 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -68,9 +68,6 @@ impl GetCpuTemplate for Option<CpuTemplateType> {
6868
}
6969
Ok(Cow::Owned(t2a::t2a()))
7070
}
71-
StaticCpuTemplate::None => {
72-
Err(InvalidStaticCpuTemplate(StaticCpuTemplate::None))
73-
}
7471
}
7572
}
7673
},
@@ -342,21 +339,6 @@ mod tests {
342339
}
343340
}
344341

345-
#[test]
346-
fn test_get_cpu_template_with_none_static_template() {
347-
// Test `get_cpu_template()` when no static CPU template is provided.
348-
// `InvalidStaticCpuTemplate` error should be returned because it is no longer valid and
349-
// was replaced with `None` of `Option<CpuTemplateType>`.
350-
let cpu_template = Some(CpuTemplateType::Static(StaticCpuTemplate::None));
351-
assert_eq!(
352-
cpu_template.get_cpu_template().unwrap_err(),
353-
GetCpuTemplateError::InvalidStaticCpuTemplate(StaticCpuTemplate::None)
354-
);
355-
356-
// Test the Display for StaticCpuTemplate
357-
assert_eq!(format!("{}", StaticCpuTemplate::None), "None");
358-
}
359-
360342
#[test]
361343
fn test_get_cpu_template_with_custom_template() {
362344
// Test `get_cpu_template()` when a custom CPU template is provided. The borrowed

src/vmm/src/cpu_config/x86_64/static_cpu_templates/mod.rs

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
use derive_more::Display;
55
use serde::{Deserialize, Serialize};
66

7+
use crate::cpu_config::templates::CpuTemplateType;
8+
79
/// Module with C3 CPU template for x86_64
810
pub mod c3;
911
/// Module with T2 CPU template for x86_64
@@ -17,7 +19,7 @@ pub mod t2s;
1719

1820
/// Template types available for configuring the x86 CPU features that map
1921
/// to EC2 instances.
20-
#[derive(Debug, Default, Display, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
22+
#[derive(Debug, Display, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
2123
pub enum StaticCpuTemplate {
2224
/// C3 Template.
2325
#[display(fmt = "C3")]
@@ -28,10 +30,6 @@ pub enum StaticCpuTemplate {
2830
/// T2S Template.
2931
#[display(fmt = "T2S")]
3032
T2S,
31-
/// No CPU template is used.
32-
#[default]
33-
#[display(fmt = "None")]
34-
None,
3533
/// T2CL Template.
3634
#[display(fmt = "T2CL")]
3735
T2CL,
@@ -40,10 +38,12 @@ pub enum StaticCpuTemplate {
4038
T2A,
4139
}
4240

43-
impl StaticCpuTemplate {
44-
/// Check if no template specified
45-
pub fn is_none(&self) -> bool {
46-
self == &StaticCpuTemplate::None
41+
impl From<&CpuTemplateType> for Option<StaticCpuTemplate> {
42+
fn from(val: &CpuTemplateType) -> Self {
43+
match val {
44+
CpuTemplateType::Custom(_) => None,
45+
CpuTemplateType::Static(template) => Some(*template),
46+
}
4747
}
4848
}
4949

src/vmm/src/persist.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ pub struct VmInfo {
5151
/// smt information
5252
pub smt: bool,
5353
/// CPU template type
54-
pub cpu_template: StaticCpuTemplate,
54+
pub cpu_template: Option<StaticCpuTemplate>,
5555
/// Boot source information.
5656
pub boot_source: BootSourceConfig,
5757
}
@@ -61,7 +61,7 @@ impl From<&VmResources> for VmInfo {
6161
Self {
6262
mem_size_mib: value.vm_config.mem_size_mib as u64,
6363
smt: value.vm_config.smt,
64-
cpu_template: StaticCpuTemplate::from(&value.vm_config.cpu_template),
64+
cpu_template: value.vm_config.cpu_template.as_ref().and_then(Into::into),
6565
boot_source: value.boot_source_config().clone(),
6666
}
6767
}

src/vmm/src/resources.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1332,9 +1332,9 @@ mod tests {
13321332
mem_size_mib: Some(512),
13331333
smt: Some(true),
13341334
#[cfg(target_arch = "x86_64")]
1335-
cpu_template: Some(StaticCpuTemplate::T2),
1335+
cpu_template: Some(Some(StaticCpuTemplate::T2)),
13361336
#[cfg(target_arch = "aarch64")]
1337-
cpu_template: Some(StaticCpuTemplate::V1N1),
1337+
cpu_template: Some(Some(StaticCpuTemplate::V1N1)),
13381338
track_dirty_pages: Some(false),
13391339
};
13401340

src/vmm/src/rpc_interface.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -864,7 +864,7 @@ mod tests {
864864

865865
use super::*;
866866
use crate::cpu_config::templates::test_utils::build_test_template;
867-
use crate::cpu_config::templates::{CpuTemplateType, StaticCpuTemplate};
867+
use crate::cpu_config::templates::CpuTemplateType;
868868
use crate::devices::virtio::balloon::{BalloonConfig, BalloonError};
869869
use crate::devices::virtio::block_common::CacheType;
870870
use crate::devices::virtio::rng::EntropyError;
@@ -1071,7 +1071,7 @@ mod tests {
10711071
Self {
10721072
mem_size_mib: value.vm_config.mem_size_mib as u64,
10731073
smt: value.vm_config.smt,
1074-
cpu_template: StaticCpuTemplate::from(&value.vm_config.cpu_template),
1074+
cpu_template: value.vm_config.cpu_template.as_ref().and_then(Into::into),
10751075
boot_source: value.boot_source_config().clone(),
10761076
}
10771077
}

src/vmm/src/vmm_config/machine_config.rs

Lines changed: 24 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -90,13 +90,29 @@ pub struct MachineConfigUpdate {
9090
)]
9191
pub smt: Option<bool>,
9292
/// A CPU template that it is used to filter the CPU features exposed to the guest.
93-
#[serde(default, skip_serializing_if = "Option::is_none")]
94-
pub cpu_template: Option<StaticCpuTemplate>,
93+
#[serde(
94+
default,
95+
skip_serializing_if = "Option::is_none",
96+
deserialize_with = "some_option"
97+
)]
98+
// Needs to be wrapped in two options: The outer indicates whether the `cpu_template`
99+
// field should be updated at all (with `None` meaning "leave as is"), and the inner
100+
// indicating that, if an update should happen, whether a static template should be
101+
// used or not.
102+
pub cpu_template: Option<Option<StaticCpuTemplate>>,
95103
/// Enables or disables dirty page tracking. Enabling allows incremental snapshots.
96104
#[serde(skip_serializing_if = "Option::is_none")]
97105
pub track_dirty_pages: Option<bool>,
98106
}
99107

108+
fn some_option<'de, T, D>(deserializer: D) -> Result<Option<Option<T>>, D::Error>
109+
where
110+
T: Deserialize<'de>,
111+
D: serde::Deserializer<'de>,
112+
{
113+
Option::<T>::deserialize(deserializer).map(Some)
114+
}
115+
100116
impl MachineConfigUpdate {
101117
/// Checks if the update request contains any data.
102118
/// Returns `true` if all fields are set to `None` which means that there is nothing
@@ -121,7 +137,7 @@ impl From<MachineConfig> for MachineConfigUpdate {
121137
vcpu_count: Some(cfg.vcpu_count),
122138
mem_size_mib: Some(cfg.mem_size_mib),
123139
smt: Some(cfg.smt),
124-
cpu_template: cfg.cpu_template,
140+
cpu_template: Some(cfg.cpu_template),
125141
track_dirty_pages: Some(cfg.track_dirty_pages),
126142
}
127143
}
@@ -179,10 +195,7 @@ impl VmConfig {
179195
self.mem_size_mib = mem_size_mib;
180196

181197
if let Some(cpu_template) = update.cpu_template {
182-
self.cpu_template = match cpu_template {
183-
StaticCpuTemplate::None => None,
184-
other => Some(CpuTemplateType::Static(other)),
185-
};
198+
self.cpu_template = cpu_template.map(CpuTemplateType::Static);
186199
}
187200

188201
if let Some(track_dirty_pages) = update.track_dirty_pages {
@@ -211,7 +224,10 @@ impl From<&VmConfig> for MachineConfig {
211224
vcpu_count: value.vcpu_count,
212225
mem_size_mib: value.mem_size_mib,
213226
smt: value.smt,
214-
cpu_template: value.cpu_template.as_ref().map(|template| template.into()),
227+
cpu_template: value
228+
.cpu_template
229+
.as_ref()
230+
.and_then(|template| template.into()),
215231
track_dirty_pages: value.track_dirty_pages,
216232
}
217233
}

0 commit comments

Comments
 (0)