Merge pull request #9282 from gkurz/runtime-rs-fds-for-qemu

runtime-rs: Consolidate the handling of fds passed to QEMU
This commit is contained in:
Xuewei Niu
2024-03-16 10:26:11 +08:00
committed by GitHub
2 changed files with 9 additions and 9 deletions

View File

@@ -3690,6 +3690,7 @@ dependencies = [
"hyperlocal", "hyperlocal",
"kata-sys-util", "kata-sys-util",
"kata-types", "kata-types",
"nix 0.24.3",
"tokio", "tokio",
] ]

View File

@@ -66,13 +66,11 @@ impl QemuInner {
let mut cmdline = QemuCmdLine::new(&self.id, &self.config)?; let mut cmdline = QemuCmdLine::new(&self.id, &self.config)?;
// If there's a Vsock Device in `self.devices` the vhost-vsock file // CAUTION: File descriptors that are passed to QEMU must stay open until the QEMU process
// descriptor needs to stay open until the qemu process launches. // is started and closed afterwards. This is achieved by collecting them in _fds_for_qemu.
// This is why we need to store it in a variable at this scope. // It is mandatory for _fds_for_qemu to last until the QEMU process is forked. Leave it
let mut _vhost_fd = None; // in the outer scope of this function for this to happen. The files in _fds_for_qemu
// We need to keep the vhost-net/tuntap file descriptor open until the QEMU process launches. // should not be used in any way.
// However, we're likely not interested in the specific type of file descriptor itself. We just
// want to ensure any fds associated with network devices remain open within the current scope.
let mut _fds_for_qemu: Vec<std::fs::File> = Vec::new(); let mut _fds_for_qemu: Vec<std::fs::File> = Vec::new();
for device in &mut self.devices { for device in &mut self.devices {
@@ -89,7 +87,7 @@ impl QemuInner {
DeviceType::Vsock(vsock_dev) => { DeviceType::Vsock(vsock_dev) => {
let fd = vsock_dev.init_config().await?; let fd = vsock_dev.init_config().await?;
cmdline.add_vsock(fd.as_raw_fd(), vsock_dev.config.guest_cid)?; cmdline.add_vsock(fd.as_raw_fd(), vsock_dev.config.guest_cid)?;
_vhost_fd = Some(fd); _fds_for_qemu.push(fd.into_std().await);
} }
DeviceType::Block(block_dev) => { DeviceType::Block(block_dev) => {
if block_dev.config.path_on_host == self.config.boot_info.initrd { if block_dev.config.path_on_host == self.config.boot_info.initrd {
@@ -114,7 +112,8 @@ impl QemuInner {
// we need ensure add_network_device happens in netns. // we need ensure add_network_device happens in netns.
let _netns_guard = NetnsGuard::new(&netns).context("new netns guard")?; let _netns_guard = NetnsGuard::new(&netns).context("new netns guard")?;
_fds_for_qemu = cmdline.add_network_device(&network.config, network_info)?; _fds_for_qemu
.append(&mut cmdline.add_network_device(&network.config, network_info)?);
} }
_ => info!(sl!(), "qemu cmdline: unsupported device: {:?}", device), _ => info!(sl!(), "qemu cmdline: unsupported device: {:?}", device),
} }