* [PATCH qemu-server 1/1] fix #7590: qemu-server: apply timeout to QEMU start fork
2026-06-25 11:44 [PATCH qemu-server 0/1] fix #7590: qemu-server: apply timeout to QEMU start fork Samuel Rufinatscha
@ 2026-06-25 11:45 ` Samuel Rufinatscha
0 siblings, 0 replies; 2+ messages in thread
From: Samuel Rufinatscha @ 2026-06-25 11:45 UTC (permalink / raw)
To: pve-devel
Apply the existing start timeout to the forked QEMU startup path and
clean up the VM scope on timeout. This prevents stuck qmstart tasks
from holding the config lock indefinitely or leaving a partially
started QEMU process running.
Signed-off-by: Samuel Rufinatscha <s.rufinatscha@proxmox.com>
Link: https://bugzilla.proxmox.com/show_bug.cgi?id=7590
---
src/PVE/QemuServer.pm | 28 +++++++++++++++++++++++++++-
1 file changed, 27 insertions(+), 1 deletion(-)
diff --git a/src/PVE/QemuServer.pm b/src/PVE/QemuServer.pm
index 55e9f520..df400376 100644
--- a/src/PVE/QemuServer.pm
+++ b/src/PVE/QemuServer.pm
@@ -5762,7 +5762,7 @@ sub vm_start_nolock {
};
my $run_qemu = sub {
- PVE::Tools::run_fork sub {
+ my $run_qemu_child = sub {
PVE::Systemd::enter_systemd_scope($vmid, "Proxmox VE VM $vmid",
%systemd_properties);
@@ -5791,6 +5791,32 @@ sub vm_start_nolock {
die "QEMU exited with code $exitcode\n";
}
};
+
+ my (undef, $timed_out) =
+ PVE::Tools::run_fork_with_timeout($start_timeout || undef, $run_qemu_child);
+
+ if ($timed_out) {
+ eval {
+ run_command(
+ [
+ '/bin/systemctl',
+ 'kill',
+ '--kill-whom=all',
+ '--signal=KILL',
+ "$vmid.scope",
+ ],
+ %silence_std_outs,
+ noerr => 1,
+ timeout => 10,
+ );
+ PVE::Systemd::wait_for_unit_removed("$vmid.scope", 20);
+ };
+ warn "failed to clean up timed-out VM start scope - $@" if $@;
+
+ $cleanup_qsd->();
+
+ die "QEMU start timed out after $start_timeout seconds\n";
+ }
};
if ($conf->{hugepages}) {
--
2.47.3
^ permalink raw reply related [flat|nested] 2+ messages in thread