From nobody Mon Sep 14 04:49:17 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of lists.libvirt.org designates 38.145.34.151 as permitted sender) client-ip=38.145.34.151; envelope-from=devel-bounces@lists.libvirt.org; helo=lists.libvirt.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of lists.libvirt.org designates 38.145.34.151 as permitted sender) smtp.mailfrom=devel-bounces@lists.libvirt.org; dmarc=pass(p=reject dis=none) header.from=lists.libvirt.org ARC-Seal: i=1; a=rsa-sha256; t=1789080861; cv=none; d=zohomail.com; s=zohoarc; b=SW8l0CQeGmYI3k3fte6DdFNvaLChvydNsK8LZPoUhU2r3JUPmhBaECk/b/aDvHPhp+zI/Wy3hNrrc4o1SogYbLKBM5KL5T1NRJ6z3WLvhK1rTIfZAOYXoeEl40TkbZyzoOzvUM0fgNiVTCUW60jyvpTOn8nWmruyyQdLzUZG1eo= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1789080861; h=Content-Transfer-Encoding:Date:Date:From:From:List-Subscribe:List-Post:List-Owner:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:Reply-To:Reply-To:Subject:Subject:To:To:Message-Id:Cc; bh=cSzE53GDO4LdweGCj6thySbamoFYKtROzp24bqigtAg=; b=Ogi1TUtJht1fdDGqElp4EtwPhFP/C3Z0Lw6YecXmW595xJtpPHIsyYqzfQuGgs6Ex8AokZZOipBuXa+pfKgNrt8fm9I5caD/fEJusU4zs/M6+IvD1CyLO5HZy0qaXVJ0ZG1iJ0xcxVyAq8ql1Qsm7Y8X2k6p4E5Ejwqbl5djqW0= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of lists.libvirt.org designates 38.145.34.151 as permitted sender) smtp.mailfrom=devel-bounces@lists.libvirt.org; dmarc=pass header.from= (p=reject dis=none) Return-Path: Received: from lists.libvirt.org (lists.libvirt.org [38.145.34.151]) by mx.zohomail.com with SMTPS id 1789080861423227.93971392982132; Thu, 10 Sep 2026 15:54:21 -0700 (PDT) Received: by lists.libvirt.org (Postfix, from userid 993) id A92A93F941; Thu, 10 Sep 2026 18:54:19 -0400 (EDT) Received: from [172.19.199.13] (unknown [10.16.107.18]) by lists.libvirt.org (Postfix) with ESMTP id 994073F942 for ; Thu, 10 Sep 2026 18:53:04 -0400 (EDT) Received: by lists.libvirt.org (Postfix, from userid 993) id 8EFF33F317; Thu, 10 Sep 2026 18:52:55 -0400 (EDT) Received: from mail-wm2-x10.google.com (mail-wm2-x10.google.com [IPv6:2a00:1450:4864:31::10]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (3072 bits) server-digest SHA256) (No client certificate requested) by lists.libvirt.org (Postfix) with ESMTPS id 7D38F3F232 for ; Thu, 10 Sep 2026 18:52:54 -0400 (EDT) Received: by mail-wm2-x10.google.com with SMTP id 5b1f17b1804b1-49cd38e0e5dso4215785e9.2 for ; Thu, 10 Sep 2026 15:52:54 -0700 (PDT) Received: from localhost ([69.51.117.28]) by smtp.gmail.com with UTF8SMTPSA id 5a478bee46e88-33ba4fa50efsm1260229eec.28.2026.09.10.15.52.51 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 10 Sep 2026 15:52:52 -0700 (PDT) X-Spam-Checker-Version: SpamAssassin 4.0.1 (2024-03-26) on lists.libvirt.org X-Spam-Level: X-Spam-Status: No, score=-2.7 required=5.0 tests=BAYES_00,DKIM_INVALID, DKIM_SIGNED,MAILING_LIST_MULTI,RCVD_IN_DNSWL_NONE,SPF_HELO_NONE autolearn=unavailable autolearn_force=no version=4.0.1 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.com; s=google; t=1789080773; x=1789685573; darn=lists.libvirt.org; h=content-transfer-encoding:mime-version:message-id:date:subject:to :from:from:to:cc:subject:date:message-id:reply-to:content-type; bh=cSzE53GDO4LdweGCj6thySbamoFYKtROzp24bqigtAg=; b=cEU23UxPH+0+R/6ZA/V/PVVeog/lFG/68iA2JJE3zmFTGe2n8sAWErQnkZYf3le4oJ zmL63MtxqQkUzRg5PDXGSk4fa5u6cq86xqqY7o7xd9advAiErj/tzVuU/D/uWYMtfnoW 6+ON9e/Cz1FsvQvcdaqbI8o4mghV55FdmnGwu5VgCWCl9ooMLLZ5Q2iAVsHDBK93BMTc sYD4mHvZwGZZRKVxa4n9LrPC5jBWOesJjLeCNR/1JroiKikLUHcGkcsgmrICN8ZDqC6t nnGV1V/xagH/QjeUKBSf176vE9qN0B01BSCc/S3+CDDT+aLl+W6PYrecarW+zTctAfG/ wVGg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1789080773; x=1789685573; h=content-transfer-encoding:mime-version:message-id:date:subject:to :from:x-gm-gg:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to:content-type; bh=cSzE53GDO4LdweGCj6thySbamoFYKtROzp24bqigtAg=; b=A9BSAO5vykN1o1q1IkhCMeypakG2rg06eoj/BBdfwYYzMs0BXm6SznSrStdBRtrJBo A5LW7WlFOUTm6ozYGTd6KszpbqqlvdMZGn4EkGx4fpPoKIvrjccMgFfUrL4xGP69Jg27 PdJh0CYI6zF9oMSXZunN0Dj5OidnVj2f8bn5KGtm2aKlBZpq2INeQGhX9pvzKp6ufeuC /RRGHIfjKmZafCW+6TPWPXjzDIEEGBEWHn1sv7GreB9+bSzLJRdPQTOK1l+cTiqXUZvp NUqzZIhOUmlJke37O8kPkF5YSpoVQaSOO3484AXMB0a27xIaNEXSmzTYfhOgvAm/OR33 BFhQ== X-Gm-Message-State: AFuF++kaZxKySODXRi3/HiGBIGZ+8fAecrVWoobmzmYngMhQWIBjnDUn I1G/YFNCzRJ26Ro2vYY+JasQqwUNyAJ50F7t+mPIksy70YRo1KSkVrzzgsvFDv0nD1WfQ4+6yll 5odSNoQ8= X-Gm-Gg: AYBFou0cuk2FefRyVWdAsGFPSEHYm49eRryWolDrPrQUvVOlR8+bCPKVT1K7WWm0Iyy KQFESVdmSDoyRmf5/b55uuRCKEk45behIMDig5OEYXUTHGDFFZb602FoiIF2bgMYMLZ8nwKak30 JqJcXU8pws3CGyT3lCJtQvyX/NETDuDhe/W5PuRhLTvuwVP79QPkZMHMQrD1MZiYrChKMstBjgD 5LNm+3xYobC7WCxFtCdMUUXNQm4V5CqJv97V4oJKAQGUDJ8zb0V5m/Gfvo+WebSFg0AERf7YlRs 6mM4lZqhJAgMxu2J1Bs1MHd7+iaSC+u9MFsrdivW0NzTJh3Ui4ETJk/giqnREusbzMZa3Xri1UZ zTsPU1cH6JYs1WIzFCfod2N8RuzMXJKmlMdwT/qNx7Vl3a+EkVE4FzG0zXLocx+dut/KJXhNgYN 5HnAGvAaYtqv+hXlenXHwEFgPQ0LNbNUzgOYVC5+s4uheuhwSIqM9reXzfWoKf2g== X-Received: by 2002:a05:600c:3d8b:b0:49d:1cc7:5ec3 with SMTP id 5b1f17b1804b1-49e619e81bfmr25990565e9.9.1789080773161; Thu, 10 Sep 2026 15:52:53 -0700 (PDT) To: devel@lists.libvirt.org Subject: [PATCH] qemu: fix missing audit record and lifecycle event on delayed shutdown Date: Thu, 10 Sep 2026 16:51:38 -0600 Message-ID: <20260910225250.349387-1-jfehlig@suse.com> X-Mailer: git-send-email 2.51.0 MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Message-ID-Hash: F3KTV3RNALBDASCVOE7CSWBBN3NTIYXN X-Message-ID-Hash: F3KTV3RNALBDASCVOE7CSWBBN3NTIYXN X-MailFrom: jfehlig@suse.com X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; loop; banned-address; header-match-devel.lists.libvirt.org-0; 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: Development discussions about the libvirt library & tools Archived-At: List-Archive: List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: From: Jim Fehlig via Devel Reply-To: Jim Fehlig X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1789080866015158500 Content-Type: text/plain; charset="utf-8" From: Jim Fehlig When a guest shuts down gracefully but its QEMU process takes a long time to cleanup and exit, virProcessKillPainfullyDelay() (used by qemuProcessKill()) times out and returns failure. This causes qemuProcessBeginStopJob() to fail in processMonitorEOFEvent(), which returns early without ever calling qemuProcessStop(), virDomainAuditStop() or queuing the VIR_DOMAIN_EVENT_STOPPED lifecycle event. In this case, qemuProcessKill() falls back to asynchronously monitoring the QEMU process via a pidfd. Once the process is finally confirmed to have exited, QEMU_PROCESS_EVENT_SHUTDOWN_COMPLETED is submitted and handled by processShutdownCompletedEvent(). That function does complete the stop by calling qemuProcessStop() and qemuDomainRemoveInactive(), but it never generates the audit record or the lifecycle event, since that logic lived only in processMonitorEOFEvent(). Management apps relying on the VIR_DOMAIN_EVENT_STOPPED event, or on the audit log, never learn that the domain actually stopped. Fix this by factoring the reason-detection, qemuProcessStop(), audit and lifecycle event logic out of processMonitorEOFEvent() into a new helper, qemuProcessFinishStop(), and call it from both processMonitorEOFEvent() and processShutdownCompletedEvent(). This ensures the audit record and lifecycle event are always generated once the QEMU process has exited, regardless of which path detected it. Signed-off-by: Jim Fehlig --- src/qemu/qemu_driver.c | 61 +++++++++++++++++++++++++----------------- 1 file changed, 36 insertions(+), 25 deletions(-) diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 8498568623..8bb037966b 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -4166,9 +4166,9 @@ processJobStatusChangeEvent(virDomainObj *vm, =20 =20 static void -processMonitorEOFEvent(virQEMUDriver *driver, - virDomainObj *vm, - int domid) +qemuProcessFinishStop(virQEMUDriver *driver, + virDomainObj *vm, + bool migration) { qemuDomainObjPrivate *priv =3D vm->privateData; int eventReason =3D VIR_DOMAIN_EVENT_STOPPED_SHUTDOWN; @@ -4176,27 +4176,9 @@ processMonitorEOFEvent(virQEMUDriver *driver, const char *auditReason =3D "shutdown"; unsigned int stopFlags =3D 0; virObjectEvent *event =3D NULL; - bool migration; - - if (vm->def->id !=3D domid) { - VIR_DEBUG("Domain %s was restarted, ignoring EOF", - vm->def->name); - return; - } - - if (qemuProcessBeginStopJob(vm, VIR_JOB_DESTROY, true) < 0) - return; - - migration =3D vm->job->asyncJob =3D=3D VIR_ASYNC_JOB_MIGRATION_IN; - - if (!virDomainObjIsActive(vm)) { - VIR_DEBUG("Domain %p '%s' is not active, ignoring EOF", - vm, vm->def->name); - goto endjob; - } =20 if (virDomainObjGetState(vm, NULL) !=3D VIR_DOMAIN_SHUTDOWN) { - VIR_DEBUG("Monitor connection to '%s' closed without SHUTDOWN even= t; " + VIR_DEBUG("qemu process for '%s' disappeared without SHUTDOWN even= t; " "assuming the domain crashed", vm->def->name); eventReason =3D VIR_DOMAIN_EVENT_STOPPED_FAILED; stopReason =3D VIR_DOMAIN_SHUTOFF_CRASHED; @@ -4214,6 +4196,34 @@ processMonitorEOFEvent(virQEMUDriver *driver, qemuProcessStop(vm, stopReason, VIR_ASYNC_JOB_NONE, stopFlags); virDomainAuditStop(vm, auditReason); virObjectEventStateQueue(driver->domainEventState, event); +} + + +static void +processMonitorEOFEvent(virQEMUDriver *driver, + virDomainObj *vm, + int domid) +{ + bool migration; + + if (vm->def->id !=3D domid) { + VIR_DEBUG("Domain %s was restarted, ignoring EOF", + vm->def->name); + return; + } + + if (qemuProcessBeginStopJob(vm, VIR_JOB_DESTROY, true) < 0) + return; + + migration =3D vm->job->asyncJob =3D=3D VIR_ASYNC_JOB_MIGRATION_IN; + + if (!virDomainObjIsActive(vm)) { + VIR_DEBUG("Domain %p '%s' is not active, ignoring EOF", + vm, vm->def->name); + goto endjob; + } + + qemuProcessFinishStop(driver, vm, migration); =20 endjob: qemuDomainRemoveInactive(vm, 0, migration); @@ -4370,13 +4380,14 @@ processNbdkitExitedEvent(virDomainObj *vm, =20 =20 static void -processShutdownCompletedEvent(virDomainObj *vm) +processShutdownCompletedEvent(virQEMUDriver *driver, + virDomainObj *vm) { if (qemuProcessBeginStopJob(vm, VIR_JOB_DESTROY, true) < 0) return; =20 if (virDomainObjIsActive(vm)) { - qemuProcessStop(vm, VIR_DOMAIN_SHUTOFF_UNKNOWN, VIR_ASYNC_JOB_NONE= , 0); + qemuProcessFinishStop(driver, vm, false); qemuDomainRemoveInactive(vm, 0, false); } =20 @@ -4449,7 +4460,7 @@ qemuProcessEventHandler(void *data, processNbdkitExitedEvent(vm, processEvent->data); break; case QEMU_PROCESS_EVENT_SHUTDOWN_COMPLETED: - processShutdownCompletedEvent(vm); + processShutdownCompletedEvent(driver, vm); break; case QEMU_PROCESS_EVENT_LAST: break; --=20 2.51.0