vmm: Add "prefault" option when restoring

Now that the restore path uses RestoreConfig structure, we add a new
parameter called "prefault" to it. This will give the user the ability
to populate the pages corresponding to the mapped regions backed by the
snapshotted memory files.

Signed-off-by: Sebastien Boeuf <sebastien.boeuf@intel.com>
This commit is contained in:
Sebastien Boeuf 2020-04-07 15:54:33 +02:00
parent a517ca23a0
commit 8d9d22436a
4 changed files with 20 additions and 5 deletions

View File

@ -1117,23 +1117,34 @@ impl VsockConfig {
#[derive(Clone, Debug, PartialEq, Deserialize, Serialize)]
pub struct RestoreConfig {
pub source_url: PathBuf,
#[serde(default)]
pub prefault: bool,
}
impl RestoreConfig {
pub const SYNTAX: &'static str = "Restore from a VM snapshot. \
Restore parameters \"source_url=<source_url>\" \
source_url should be a valid URL (e.g file:///foo/bar or tcp://192.168.1.10/foo)";
\nRestore parameters \"source_url=<source_url>,prefault=on|off\" \
\n`source_url` should be a valid URL (e.g file:///foo/bar or tcp://192.168.1.10/foo) \
\n`prefault` brings memory pages in when enabled (disabled by default)";
pub fn parse(restore: &str) -> Result<Self> {
let mut parser = OptionParser::new();
parser.add("source_url");
parser.add("source_url").add("prefault");
parser.parse(restore).map_err(Error::ParseRestore)?;
let source_url = parser
.get("source_url")
.map(PathBuf::from)
.ok_or(Error::ParseRestoreSourceUrlMissing)?;
let prefault = parser
.convert::<Toggle>("prefault")
.map_err(Error::ParseRestore)?
.unwrap_or(Toggle(false))
.0;
Ok(RestoreConfig { source_url })
Ok(RestoreConfig {
source_url,
prefault,
})
}
}

View File

@ -331,6 +331,7 @@ impl Vmm {
reset_evt,
self.vmm_path.clone(),
source_url,
restore_cfg.prefault,
)?;
self.vm = Some(vm);

View File

@ -387,6 +387,7 @@ impl MemoryManager {
fd: Arc<VmFd>,
config: &MemoryConfig,
source_url: &str,
prefault: bool,
) -> Result<Arc<Mutex<MemoryManager>>, Error> {
let url = Url::parse(source_url).unwrap();
/* url must be valid dir which is verified in recv_vm_snapshot() */
@ -419,7 +420,7 @@ impl MemoryManager {
// allows for a faster VM restoration and does not require us to
// fill the memory content, hence we can return right away.
if config.file.is_none() {
return MemoryManager::new(fd, config, Some(ext_regions), false);
return MemoryManager::new(fd, config, Some(ext_regions), prefault);
};
let memory_manager = MemoryManager::new(fd, config, None, false)?;

View File

@ -388,6 +388,7 @@ impl Vm {
reset_evt: EventFd,
vmm_path: PathBuf,
source_url: &str,
prefault: bool,
) -> Result<Self> {
let (kvm, fd) = Vm::kvm_new()?;
let config = vm_config_from_snapshot(snapshot).map_err(Error::Restore)?;
@ -400,6 +401,7 @@ impl Vm {
fd.clone(),
&config.lock().unwrap().memory.clone(),
source_url,
prefault,
)
.map_err(Error::MemoryManager)?
} else {