summary refs log tree commit diff
path: root/host/start-vm/start-vm.rs
diff options
context:
space:
mode:
authorAlyssa Ross <hi@alyssa.is>2023-06-18 13:14:14 +0000
committerAlyssa Ross <hi@alyssa.is>2023-06-24 08:12:25 +0000
commita72481208b75d40b350b330b91a2f4d881caa2c5 (patch)
treea7cb656ac734471bf0d10d7ba102dc1dc089d55e /host/start-vm/start-vm.rs
parent35c8269325c3d03c0592a25abb9a469bd41697e7 (diff)
downloadspectrum-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.rs22
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);
 }