From nobody Mon Feb 9 20:32:25 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=bitdefender.com ARC-Seal: i=1; a=rsa-sha256; t=1586913254; cv=none; d=zohomail.com; s=zohoarc; b=ggRY/YGwg+VKHFbDZVn166VlPQ/JH2rBBn9AXmfUZDsmNQhCwjPsLnqsB3hXBkuW9ZK3ZzksM8ZqYUF9x+wsBOpdFPDn+7Uaz7kszFYcs+czuBOScUxS706yDJjO/CgotW7JUd/oUhz8UyrDAW0b+H5TL7RPaAVMc/VC7+NS08E= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1586913254; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=HQbJuHtBAAzA9T2ojkfASMccQEda43a0jsM33yxr7/Y=; b=Ub5lIYElo5Tfo2r3X7LSh1MAXSUYqqI2S88C+y1LZ1CEhMOuGt91eUcji2OKmP0qTK4+Fh9D/uPRIGm2aEYQrzMULLsYCavgwfjRCYGJ/kcaBVPvkZnk/TpsyB2i5vbEuekqa8J2UILqx4e3lTIMSUKeR1bPXVUAfnHFct27XUc= ARC-Authentication-Results: i=1; mx.zohomail.com; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 158691325411220.296885456645327; Tue, 14 Apr 2020 18:14:14 -0700 (PDT) Received: from localhost ([::1]:41014 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jOWd1-0002WN-Pp for importer@patchew.org; Tue, 14 Apr 2020 21:14:11 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:58554) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jOWPC-0001QE-3j for qemu-devel@nongnu.org; Tue, 14 Apr 2020 20:59:55 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1jOWP9-0005D9-At for qemu-devel@nongnu.org; Tue, 14 Apr 2020 20:59:53 -0400 Received: from mx01.bbu.dsd.mx.bitdefender.com ([91.199.104.161]:49112) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1jOWP8-00052h-Rq for qemu-devel@nongnu.org; Tue, 14 Apr 2020 20:59:51 -0400 Received: from smtp.bitdefender.com (smtp02.buh.bitdefender.net [10.17.80.76]) by mx01.bbu.dsd.mx.bitdefender.com (Postfix) with ESMTPS id 559503074866; Wed, 15 Apr 2020 03:59:36 +0300 (EEST) Received: from localhost.localdomain (unknown [91.199.104.27]) by smtp.bitdefender.com (Postfix) with ESMTPSA id 3C8CC305B7A2; Wed, 15 Apr 2020 03:59:36 +0300 (EEST) From: =?UTF-8?q?Adalbert=20Laz=C4=83r?= To: qemu-devel@nongnu.org Subject: [RFC PATCH v1 23/26] kvm: vmi: intercept shutdown Date: Wed, 15 Apr 2020 03:59:35 +0300 Message-Id: <20200415005938.23895-24-alazar@bitdefender.com> In-Reply-To: <20200415005938.23895-1-alazar@bitdefender.com> References: <20200415005938.23895-1-alazar@bitdefender.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 91.199.104.161 X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: =?UTF-8?q?Adalbert=20Laz=C4=83r?= , Marian Rotariu , Markus Armbruster Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Type: text/plain; charset="utf-8" From: Marian Rotariu On shutdown, it is desirable that the introspection tool removes its changes from the introspected VM, so that they don't reach the hibernation file. CC: Markus Armbruster Signed-off-by: Marian Rotariu Signed-off-by: Adalbert Laz=C4=83r --- accel/kvm/vmi.c | 31 +++++++++++++++++++++++++++---- include/sysemu/vmi-intercept.h | 1 + monitor/qmp-cmds.c | 4 ++++ 3 files changed, 32 insertions(+), 4 deletions(-) diff --git a/accel/kvm/vmi.c b/accel/kvm/vmi.c index bee9798e54..2c6981a4bf 100644 --- a/accel/kvm/vmi.c +++ b/accel/kvm/vmi.c @@ -85,10 +85,12 @@ static const char *action_string[] =3D { "resume", "force-reset", "migrate", + "shutdown", }; =20 static bool suspend_pending; static bool migrate_pending; +static bool shutdown_pending; =20 #define TYPE_VM_INTROSPECTION "introspection" =20 @@ -511,6 +513,17 @@ static void enable_socket_reconnect(VMIntrospection *i) =20 static void maybe_disable_socket_reconnect(VMIntrospection *i) { + if (shutdown_pending) { + /* + * We've got the shutdown notification, but the guest might not st= op. + * We already caused the introspection tool to unhook + * because shutdown_pending was set. + * Let the socket connect again just in case the guest doesn't sto= p. + */ + shutdown_pending =3D false; + return; + } + if (i->reconnect_time =3D=3D 0) { info_report("VMI: disable socket reconnect"); i->reconnect_time =3D qemu_chr_fe_reconnect_time(&i->sock, 0); @@ -526,6 +539,9 @@ static void continue_with_the_intercepted_action(VMIntr= ospection *i) case VMI_INTERCEPT_MIGRATE: start_live_migration_thread(migrate_get_current()); break; + case VMI_INTERCEPT_SHUTDOWN: + qemu_system_powerdown_request(); + break; default: error_report("VMI: %s: unexpected action %d", __func__, i->intercepted_action); @@ -625,9 +641,10 @@ static void chr_event_open(VMIntrospection *i) { Error *local_err =3D NULL; =20 - if (suspend_pending || migrate_pending) { - info_report("VMI: %s: too soon (suspend=3D%d, migrate=3D%d)", - __func__, suspend_pending, migrate_pending); + if (suspend_pending || migrate_pending || shutdown_pending) { + info_report("VMI: %s: too soon (suspend=3D%d, migrate=3D%d, shutdo= wn=3D%d)", + __func__, suspend_pending, migrate_pending, + shutdown_pending); maybe_disable_socket_reconnect(i); qemu_chr_fe_disconnect(&i->sock); return; @@ -662,7 +679,7 @@ static void chr_event_close(VMIntrospection *i) cancel_unhook_timer(i); cancel_handshake_timer(i); =20 - if (suspend_pending || migrate_pending) { + if (suspend_pending || migrate_pending || shutdown_pending) { maybe_disable_socket_reconnect(i); =20 if (i->intercepted_action !=3D VMI_INTERCEPT_NONE) { @@ -752,6 +769,9 @@ static bool record_intercept_action(VMI_intercept_comma= nd action) case VMI_INTERCEPT_MIGRATE: migrate_pending =3D true; break; + case VMI_INTERCEPT_SHUTDOWN: + shutdown_pending =3D true; + break; default: return false; } @@ -839,6 +859,9 @@ static void vm_introspection_reset(void *opaque) } =20 update_vm_start_time(i); + + /* warm reset triggered by user */ + shutdown_pending =3D false; } =20 static bool make_cookie_hash(const char *key_id, uint8_t *cookie_hash, diff --git a/include/sysemu/vmi-intercept.h b/include/sysemu/vmi-intercept.h index 4b93d17f2b..da086d7a04 100644 --- a/include/sysemu/vmi-intercept.h +++ b/include/sysemu/vmi-intercept.h @@ -16,6 +16,7 @@ typedef enum { VMI_INTERCEPT_RESUME, VMI_INTERCEPT_FORCE_RESET, VMI_INTERCEPT_MIGRATE, + VMI_INTERCEPT_SHUTDOWN, } VMI_intercept_command; =20 bool vm_introspection_intercept(VMI_intercept_command ic, Error **errp); diff --git a/monitor/qmp-cmds.c b/monitor/qmp-cmds.c index d164635b5f..333a4a0ecc 100644 --- a/monitor/qmp-cmds.c +++ b/monitor/qmp-cmds.c @@ -107,6 +107,10 @@ void qmp_system_reset(Error **errp) =20 void qmp_system_powerdown(Error **errp) { + if (vm_introspection_intercept(VMI_INTERCEPT_SHUTDOWN, errp)) { + return; + } + qemu_system_powerdown_request(); } =20