From nobody Mon Feb 9 19:06:17 2026 Delivered-To: importer@patchew.org Received-SPF: none (zohomail.com: 8.43.85.245 is neither permitted nor denied by domain of lists.libvirt.org) client-ip=8.43.85.245; envelope-from=devel-bounces@lists.libvirt.org; helo=lists.libvirt.org; Authentication-Results: mx.zohomail.com; spf=none (zohomail.com: 8.43.85.245 is neither permitted nor denied by domain of lists.libvirt.org) smtp.mailfrom=devel-bounces@lists.libvirt.org; dmarc=fail(p=none dis=none) header.from=intel.com Return-Path: Received: from lists.libvirt.org (lists.libvirt.org [8.43.85.245]) by mx.zohomail.com with SMTPS id 1701076638422291.3806249638436; Mon, 27 Nov 2023 01:17:18 -0800 (PST) Received: by lists.libvirt.org (Postfix, from userid 996) id C8DF019FD; Mon, 27 Nov 2023 04:17:17 -0500 (EST) Received: from lists.libvirt.org (localhost [IPv6:::1]) by lists.libvirt.org (Postfix) with ESMTP id 39F011A34; Mon, 27 Nov 2023 04:01:11 -0500 (EST) Received: by lists.libvirt.org (Postfix, from userid 996) id DE38518BF; Mon, 27 Nov 2023 04:00:35 -0500 (EST) Received: from mgamail.intel.com (mgamail.intel.com [192.55.52.115]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by lists.libvirt.org (Postfix) with ESMTPS id 8576B195A for ; Mon, 27 Nov 2023 03:58:43 -0500 (EST) Received: from fmviesa002.fm.intel.com ([10.60.135.142]) by fmsmga103.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 27 Nov 2023 00:57:39 -0800 Received: from spr-s2600bt.bj.intel.com ([10.240.192.124]) by fmviesa002-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 27 Nov 2023 00:57:36 -0800 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on lists.libvirt.org X-Spam-Level: X-Spam-Status: No, score=-3.1 required=5.0 tests=HEADER_FROM_DIFFERENT_DOMAINS, MAILING_LIST_MULTI,RCVD_IN_DNSWL_MED,SPF_HELO_NONE, T_SCC_BODY_TEXT_LINE autolearn=unavailable autolearn_force=no version=3.4.4 X-IronPort-AV: E=McAfee;i="6600,9927,10906"; a="392413800" X-IronPort-AV: E=Sophos;i="6.04,230,1695711600"; d="scan'208";a="392413800" X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.04,230,1695711600"; d="scan'208";a="9716798" From: Zhenzhong Duan To: devel@lists.libvirt.org Subject: [PATCH rfcv3 09/11] qemu: Extend hard reboot in Qemu driver Date: Mon, 27 Nov 2023 16:55:19 +0800 Message-Id: <20231127085521.6813-10-zhenzhong.duan@intel.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20231127085521.6813-1-zhenzhong.duan@intel.com> References: <20231127085521.6813-1-zhenzhong.duan@intel.com> MIME-Version: 1.0 Message-ID-Hash: 7AVN3LX7SZFXZQUQVOYNAELK25WKHUL5 X-Message-ID-Hash: 7AVN3LX7SZFXZQUQVOYNAELK25WKHUL5 X-MailFrom: zhenzhong.duan@intel.com X-Mailman-Rule-Hits: nonmember-moderation X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; emergency; loop; banned-address; member-moderation; header-match-config-1; header-match-config-2; header-match-config-3; header-match-devel.lists.libvirt.org-0 CC: phrdina@redhat.com, pkrempa@redhat.com, jjongsma@redhat.com, jsuchane@redhat.com, chenyi.qiang@intel.com, isaku.yamahata@intel.com, xiaoyao.li@intel.com, chao.p.peng@intel.com, edwin.zhai@intel.com, Zhenzhong Duan X-Mailman-Version: 3.2.2 Precedence: list List-Id: Development discussions about the libvirt library & tools Archived-At: List-Archive: List-Help: List-Post: List-Subscribe: List-Unsubscribe: Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-ZM-MESSAGEID: 1701076640403000001 With hard reboot, we can reboot a TDX guest with 'virsh reboot' or 'virsh shutdown' if action for onPoweroff is 'restart'. But running reboot cmd in guest shell will always lead to shutdown. This behavior is not consistent with legacy guest, this patch extend hard reboot support and make TDX guest behavior same as legacy guest. Signed-off-by: Zhenzhong Duan --- src/qemu/qemu_monitor.c | 19 ++++++++++++++++++- src/qemu/qemu_monitor.h | 2 +- src/qemu/qemu_monitor_json.c | 6 +++++- src/qemu/qemu_process.c | 1 + 4 files changed, 25 insertions(+), 3 deletions(-) diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c index 320729f067..c250edf8be 100644 --- a/src/qemu/qemu_monitor.c +++ b/src/qemu/qemu_monitor.c @@ -1084,10 +1084,27 @@ qemuMonitorEmitEvent(qemuMonitor *mon, const char *= event, =20 =20 void -qemuMonitorEmitShutdown(qemuMonitor *mon, virTristateBool guest) +qemuMonitorEmitShutdown(qemuMonitor *mon, virTristateBool guest, + const char *reason) { + virDomainObj *vm =3D mon->vm; + qemuDomainObjPrivate *priv =3D vm->privateData; + VIR_DEBUG("mon=3D%p guest=3D%u", mon, guest); =20 + /* This isn't a proper place to set hardReboot but we need to access + * mon->vm which is defined in this file. Reboot in guest kernel will + * trigger SHUTDOWN event for td-guest, so we has to deal with it + * here. */ + if (vm->def->sec && + vm->def->sec->sectype =3D=3D VIR_DOMAIN_LAUNCH_SECURITY_TDX && + ((STREQ_NULLABLE(reason, "guest-shutdown") && + vm->def->onPoweroff =3D=3D VIR_DOMAIN_LIFECYCLE_ACTION_RESTART) = || + (STREQ_NULLABLE(reason, "guest-reset") && + vm->def->onReboot =3D=3D VIR_DOMAIN_LIFECYCLE_ACTION_RESTART))) { + priv->hardReboot =3D true; + } + QEMU_MONITOR_CALLBACK(mon, domainShutdown, mon->vm, guest); } =20 diff --git a/src/qemu/qemu_monitor.h b/src/qemu/qemu_monitor.h index 6c590933aa..6aae635411 100644 --- a/src/qemu/qemu_monitor.h +++ b/src/qemu/qemu_monitor.h @@ -443,7 +443,7 @@ int qemuMonitorUpdateVideoVram64Size(qemuMonitor *mon, void qemuMonitorEmitEvent(qemuMonitor *mon, const char *event, long long seconds, unsigned int micros, const char *details); -void qemuMonitorEmitShutdown(qemuMonitor *mon, virTristateBool guest); +void qemuMonitorEmitShutdown(qemuMonitor *mon, virTristateBool guest, cons= t char *reason); void qemuMonitorEmitReset(qemuMonitor *mon); void qemuMonitorEmitStop(qemuMonitor *mon); void qemuMonitorEmitResume(qemuMonitor *mon); diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c index 105d729d7c..794c22eb9c 100644 --- a/src/qemu/qemu_monitor_json.c +++ b/src/qemu/qemu_monitor_json.c @@ -546,12 +546,16 @@ qemuMonitorJSONMakeCommand(const char *cmdname, static void qemuMonitorJSONHandleShutdown(qemuMonitor *mon, virJSONValue *= data) { bool guest =3D false; + const char *reason =3D NULL; virTristateBool guest_initiated =3D VIR_TRISTATE_BOOL_ABSENT; =20 if (data && virJSONValueObjectGetBoolean(data, "guest", &guest) =3D=3D= 0) guest_initiated =3D virTristateBoolFromBool(guest); =20 - qemuMonitorEmitShutdown(mon, guest_initiated); + if (data) + reason =3D virJSONValueObjectGetString(data, "reason"); + + qemuMonitorEmitShutdown(mon, guest_initiated, reason); } =20 static void qemuMonitorJSONHandleReset(qemuMonitor *mon, virJSONValue *dat= a G_GNUC_UNUSED) diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c index 9fa679e408..a9bba19852 100644 --- a/src/qemu/qemu_process.c +++ b/src/qemu/qemu_process.c @@ -591,6 +591,7 @@ qemuProcessShutdownOrReboot(virDomainObj *vm) vm) < 0) { VIR_ERROR(_("Failed to create hard reboot thread, killing doma= in")); ignore_value(qemuProcessKill(vm, VIR_QEMU_PROCESS_KILL_NOWAIT)= ); + qemuDomainSetHardReboot(vm, false); virObjectUnref(vm); } } else if (priv->fakeReboot || --=20 2.34.1 _______________________________________________ Devel mailing list -- devel@lists.libvirt.org To unsubscribe send an email to devel-leave@lists.libvirt.org