vmm: add prefault option in memory and memory-zone

The argument `prefault` is provided in MemoryManager, but it can
only be used by SGX and restore.
With prefault (MAP_POPULATE) been set, subsequent page faults will
decrease during running, although it will make boot slower.

This commit adds `prefault` in MemoryConfig and MemoryZoneConfig.
To resolve conflict between memory and restore, argument
`prefault` has been changed from `bool` to `Option<bool>`, when
its value is None, config from memory will be used, otherwise
argument in Option will be used.

Signed-off-by: Yu Li <liyu.yukiteru@bytedance.com>
This commit is contained in:
Yu Li
2021-09-29 12:54:22 +08:00
committed by Sebastien Boeuf
parent 90d79fa76b
commit 08021087ec
5 changed files with 54 additions and 13 deletions

View File

@@ -491,6 +491,8 @@ pub struct MemoryZoneConfig {
pub hotplug_size: Option<u64>,
#[serde(default)]
pub hotplugged_size: Option<u64>,
#[serde(default)]
pub prefault: bool,
}
#[derive(Clone, Debug, PartialEq, Deserialize, Serialize)]
@@ -511,6 +513,8 @@ pub struct MemoryConfig {
#[serde(default)]
pub hugepage_size: Option<u64>,
#[serde(default)]
pub prefault: bool,
#[serde(default)]
pub zones: Option<Vec<MemoryZoneConfig>>,
}
@@ -526,7 +530,8 @@ impl MemoryConfig {
.add("hotplugged_size")
.add("shared")
.add("hugepages")
.add("hugepage_size");
.add("hugepage_size")
.add("prefault");
parser.parse(memory).map_err(Error::ParseMemory)?;
let size = parser
@@ -565,6 +570,11 @@ impl MemoryConfig {
.convert::<ByteSized>("hugepage_size")
.map_err(Error::ParseMemory)?
.map(|v| v.0);
let prefault = parser
.convert::<Toggle>("prefault")
.map_err(Error::ParseMemory)?
.unwrap_or(Toggle(false))
.0;
let zones: Option<Vec<MemoryZoneConfig>> = if let Some(memory_zones) = &memory_zones {
let mut zones = Vec::new();
@@ -579,7 +589,8 @@ impl MemoryConfig {
.add("hugepage_size")
.add("host_numa_node")
.add("hotplug_size")
.add("hotplugged_size");
.add("hotplugged_size")
.add("prefault");
parser.parse(memory_zone).map_err(Error::ParseMemoryZone)?;
let id = parser.get("id").ok_or(Error::ParseMemoryZoneIdMissing)?;
@@ -615,6 +626,11 @@ impl MemoryConfig {
.convert::<ByteSized>("hotplugged_size")
.map_err(Error::ParseMemoryZone)?
.map(|v| v.0);
let prefault = parser
.convert::<Toggle>("prefault")
.map_err(Error::ParseMemoryZone)?
.unwrap_or(Toggle(false))
.0;
zones.push(MemoryZoneConfig {
id,
@@ -626,6 +642,7 @@ impl MemoryConfig {
host_numa_node,
hotplug_size,
hotplugged_size,
prefault,
});
}
Some(zones)
@@ -642,6 +659,7 @@ impl MemoryConfig {
shared,
hugepages,
hugepage_size,
prefault,
zones,
})
}
@@ -676,6 +694,7 @@ impl Default for MemoryConfig {
shared: false,
hugepages: false,
hugepage_size: None,
prefault: false,
zones: None,
}
}
@@ -2678,6 +2697,7 @@ mod tests {
shared: false,
hugepages: false,
hugepage_size: None,
prefault: false,
zones: None,
},
kernel: Some(KernelConfig {