mirror of
https://github.com/cloud-hypervisor/cloud-hypervisor.git
synced 2026-08-05 02:19:16 +00:00
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:
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user