From be35b6008df9f1f17363fd39b6016d38f98298a2 Mon Sep 17 00:00:00 2001 From: Changyuan Lyu Date: Sat, 3 Jan 2026 13:00:50 -0800 Subject: [PATCH 1/2] fix(vsock): deregister socket listener on reset Otherwise, after a machine reboot, activate() fails at registering the listener to mio. Signed-off-by: Changyuan Lyu --- alioth/src/virtio/dev/vsock/uds_vsock.rs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/alioth/src/virtio/dev/vsock/uds_vsock.rs b/alioth/src/virtio/dev/vsock/uds_vsock.rs index ed613e4f..cf010485 100644 --- a/alioth/src/virtio/dev/vsock/uds_vsock.rs +++ b/alioth/src/virtio/dev/vsock/uds_vsock.rs @@ -809,6 +809,9 @@ impl VirtioMio for UdsVsock { log::error!("{}: failed to deregister socket: {err}", self.name); } } + if let Err(err) = registry.deregister(&mut SourceFd(&self.listener.as_raw_fd())) { + log::error!("{}: failed to deregister listener: {err}", self.name); + } self.host_ports.clear(); self.next_port = 1024; } From 5fdfb0d00763f384e78414c0df05c6c4edcb70be Mon Sep 17 00:00:00 2001 From: Changyuan Lyu Date: Sat, 3 Jan 2026 13:09:13 -0800 Subject: [PATCH 2/2] feat(vsock): run UdsVsock as a vhost-user backend Signed-off-by: Changyuan Lyu --- alioth-cli/src/vu.rs | 4 ++++ alioth/src/vm/config.rs | 6 +++++- alioth/src/vm/vm.rs | 8 ++++++++ 3 files changed, 17 insertions(+), 1 deletion(-) diff --git a/alioth-cli/src/vu.rs b/alioth-cli/src/vu.rs index 72226e0a..6d9c9fc9 100644 --- a/alioth-cli/src/vu.rs +++ b/alioth-cli/src/vu.rs @@ -22,6 +22,7 @@ use alioth::mem::mapped::RamBus; use alioth::virtio::dev::blk::BlkFileParam; use alioth::virtio::dev::fs::shared_dir::SharedDirParam; use alioth::virtio::dev::net::tap::NetTapParam; +use alioth::virtio::dev::vsock::UdsVsockParam; use alioth::virtio::dev::{DevParam, Virtio, VirtioDevice}; use alioth::virtio::vu::backend::{VuBackend, VuEventfd, VuIrqSender}; use clap::{Args, Subcommand}; @@ -88,6 +89,8 @@ pub enum DevType { Blk(DevArgs), /// VirtIO filesystem device backed by a shared host directory. Fs(DevArgs), + /// VirtIO vsock device backed by a Unix domain socket. + Vsock(DevArgs), } #[derive(Args, Debug, Clone)] @@ -138,6 +141,7 @@ pub fn start(args: VuArgs) -> Result<(), Error> { DevType::Net(args) => create_dev(format!("net-{index}"), args, memory.clone()), DevType::Blk(args) => create_dev(format!("blk-{index}"), args, memory.clone()), DevType::Fs(args) => create_dev(format!("fs-{index}"), args, memory.clone()), + DevType::Vsock(args) => create_dev(format!("vsock-{index}"), args, memory.clone()), }?; let (conn, _) = listener.accept().context(error::Accept)?; let backend = VuBackend::new(conn, dev, memory).context(error::CreateVu)?; diff --git a/alioth/src/vm/config.rs b/alioth/src/vm/config.rs index 34efac81..925cc9ff 100644 --- a/alioth/src/vm/config.rs +++ b/alioth/src/vm/config.rs @@ -36,7 +36,7 @@ use crate::{ }; #[cfg(target_os = "linux")] -#[derive(Debug, PartialEq, Eq, Deserialize, Help)] +#[derive(Debug, Clone, PartialEq, Eq, Deserialize, Help)] pub struct VuSocket { pub socket: Box, } @@ -88,6 +88,10 @@ pub enum VsockParam { /// Vsock device mapped to a Unix domain socket. #[serde(alias = "uds")] Uds(UdsVsockParam), + #[cfg(target_os = "linux")] + /// Vsock device backed by a vhost-user process. + #[serde(alias = "vu")] + Vu(VuSocket), } #[derive(Debug, Default, PartialEq, Eq, Deserialize)] diff --git a/alioth/src/vm/vm.rs b/alioth/src/vm/vm.rs index 36d618c4..0ab00683 100644 --- a/alioth/src/vm/vm.rs +++ b/alioth/src/vm/vm.rs @@ -237,6 +237,14 @@ where #[cfg(target_os = "linux")] VsockParam::Vhost(p) => vm.add_virtio_dev("vhost-vsock", p), VsockParam::Uds(p) => vm.add_virtio_dev("uds-vsock", p), + #[cfg(target_os = "linux")] + VsockParam::Vu(s) => { + let p = VuFrontendParam { + id: DeviceId::Socket, + socket: s.socket, + }; + vm.add_virtio_dev("vu-vsock", p) + } }?; }