From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from firstgate.proxmox.com (firstgate.proxmox.com [IPv6:2a01:7e0:0:424::9]) by lore.proxmox.com (Postfix) with ESMTPS id 4565C1FF13C for ; Thu, 25 Jun 2026 13:45:15 +0200 (CEST) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id 3E5D0EE0A; Thu, 25 Jun 2026 13:45:12 +0200 (CEST) From: Samuel Rufinatscha To: pve-devel@lists.proxmox.com Subject: [PATCH qemu-server 1/1] fix #7590: qemu-server: apply timeout to QEMU start fork Date: Thu, 25 Jun 2026 13:45:00 +0200 Message-ID: <20260625114500.159384-2-s.rufinatscha@proxmox.com> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260625114500.159384-1-s.rufinatscha@proxmox.com> References: <20260625114500.159384-1-s.rufinatscha@proxmox.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Bm-Milter-Handled: 55990f41-d878-4baa-be0a-ee34c49e34d2 X-Bm-Transport-Timestamp: 1782387903168 X-SPAM-LEVEL: Spam detection results: 0 AWL 0.220 Adjusted score from AWL reputation of From: address BAYES_00 -1.9 Bayes spam probability is 0 to 1% DMARC_MISSING 0.1 Missing DMARC policy KAM_DMARC_STATUS 0.01 Test Rule for DKIM or SPF Failure with Strict Alignment SPF_HELO_NONE 0.001 SPF: HELO does not publish an SPF Record SPF_PASS -0.001 SPF: sender matches SPF record URIBL_BLOCKED 0.001 ADMINISTRATOR NOTICE: The query to URIBL was blocked. See http://wiki.apache.org/spamassassin/DnsBlocklists#dnsbl-block for more information. [proxmox.com,qemuserver.pm] Message-ID-Hash: OC5W57KJSB7XPWLH3W3OMDUFF63WOLGY X-Message-ID-Hash: OC5W57KJSB7XPWLH3W3OMDUFF63WOLGY X-MailFrom: s.rufinatscha@proxmox.com X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; loop; banned-address; emergency; member-moderation; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; digests; suspicious-header X-Mailman-Version: 3.3.10 Precedence: list List-Id: Proxmox VE development discussion List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: 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 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