diff options
author | Alyssa Ross <hi@alyssa.is> | 2023-06-18 13:14:14 +0000 |
---|---|---|
committer | Alyssa Ross <hi@alyssa.is> | 2023-06-24 08:12:25 +0000 |
commit | a72481208b75d40b350b330b91a2f4d881caa2c5 (patch) | |
tree | a7cb656ac734471bf0d10d7ba102dc1dc089d55e /host/start-vm/start-vm.rs | |
parent | 35c8269325c3d03c0592a25abb9a469bd41697e7 (diff) | |
download | spectrum-a72481208b75d40b350b330b91a2f4d881caa2c5.tar spectrum-a72481208b75d40b350b330b91a2f4d881caa2c5.tar.gz spectrum-a72481208b75d40b350b330b91a2f4d881caa2c5.tar.bz2 spectrum-a72481208b75d40b350b330b91a2f4d881caa2c5.tar.lz spectrum-a72481208b75d40b350b330b91a2f4d881caa2c5.tar.xz spectrum-a72481208b75d40b350b330b91a2f4d881caa2c5.tar.zst spectrum-a72481208b75d40b350b330b91a2f4d881caa2c5.zip |
host/start-vm: don't poll for readiness
cloud-hypervisor supports specifying the API socket by file descriptor. By using that, we can notify readiness between creating the socket and exec-ing cloud-hypervisor. Signed-off-by: Alyssa Ross <hi@alyssa.is>
Diffstat (limited to 'host/start-vm/start-vm.rs')
-rw-r--r-- | host/start-vm/start-vm.rs | 22 |
1 files changed, 17 insertions, 5 deletions
diff --git a/host/start-vm/start-vm.rs b/host/start-vm/start-vm.rs index 4790841..df1ce0a 100644 --- a/host/start-vm/start-vm.rs +++ b/host/start-vm/start-vm.rs @@ -1,28 +1,40 @@ // SPDX-License-Identifier: EUPL-1.2+ -// SPDX-FileCopyrightText: 2022 Alyssa Ross <hi@alyssa.is> +// SPDX-FileCopyrightText: 2022-2023 Alyssa Ross <hi@alyssa.is> use std::env::current_dir; use std::os::unix::prelude::*; use std::path::Path; use std::process::exit; -use start_vm::{prog_name, vm_command}; +use start_vm::{create_api_socket, notify_readiness, prog_name, vm_command}; const CONFIG_ROOT: &str = "/ext/svc/data"; -fn run() -> String { +/// # Safety +/// +/// Calls [`notify_readiness`], so can only be called once. +unsafe fn run() -> String { let dir = match current_dir().map_err(|e| format!("getting current directory: {}", e)) { Ok(dir) => dir, Err(e) => return e, }; - match vm_command(dir, Path::new(CONFIG_ROOT)) { + let api_socket = match create_api_socket() { + Ok(api_socket) => api_socket, + Err(e) => return e, + }; + + if let Err(e) = notify_readiness() { + return e; + } + + match vm_command(dir, Path::new(CONFIG_ROOT), api_socket.into_raw_fd()) { Ok(mut command) => format!("failed to exec: {}", command.exec()), Err(e) => e, } } fn main() { - eprintln!("{}: {}", prog_name(), run()); + eprintln!("{}: {}", prog_name(), unsafe { run() }); exit(1); } |