From nobody Wed May 15 13:53:04 2024 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=1586912817; cv=none; d=zohomail.com; s=zohoarc; b=JF7220JbwVvwf5hgDFT6XmNbD7oK0AaZJ11h6Aw/nIzN/se1TavW+mWGdnw4ZvmTkwKF0NbsGJ8e6mQsRUJZRTMpj+ON+R8cSlLSUTbRVPOYfrBXQC61SVwqhP2B6N7DL8UfxPR5Oq6TtM4DHQW8DTBBH4TK6mdbkegdeUrP5V0= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1586912817; 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=EEc+y+VD6L2tvW9/2NKW0P14toL7GvUw0UZOfvgYVl4=; b=YqyuaxOyKcbr4kzkUPxb6GcwwTr+tuTMvvFly1OsUMEkfIzVAo5/XoHvMuRDOFwhoBlnOP57133lSbLm9tOmE6Bn0305+MrMHaWOmFhlXzKUZ+aJZtIpw4XtgZcHqEWsTfr+kU8bEThch+qmfLy0Msg/mbClJowzUVcqD6wupZI= 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 1586912817476196.17041493618524; Tue, 14 Apr 2020 18:06:57 -0700 (PDT) Received: from localhost ([::1]:40930 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jOWVz-0008Jg-Sj for importer@patchew.org; Tue, 14 Apr 2020 21:06:55 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:58402) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jOWP3-000141-9n for qemu-devel@nongnu.org; Tue, 14 Apr 2020 20:59:46 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1jOWOw-00050L-0j for qemu-devel@nongnu.org; Tue, 14 Apr 2020 20:59:45 -0400 Received: from mx01.bbu.dsd.mx.bitdefender.com ([91.199.104.161]:48994) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1jOWOv-0004y1-Kp for qemu-devel@nongnu.org; Tue, 14 Apr 2020 20:59:37 -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 074CD30747BE; Wed, 15 Apr 2020 03:59:34 +0300 (EEST) Received: from localhost.localdomain (unknown [91.199.104.27]) by smtp.bitdefender.com (Postfix) with ESMTPSA id DD216305B7A0; Wed, 15 Apr 2020 03:59:33 +0300 (EEST) From: =?UTF-8?q?Adalbert=20Laz=C4=83r?= To: qemu-devel@nongnu.org Subject: [RFC PATCH v1 01/26] chardev: tcp: allow to change the reconnect timer Date: Wed, 15 Apr 2020 03:59:13 +0300 Message-Id: <20200415005938.23895-2-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?= , =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= , Paolo Bonzini Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Type: text/plain; charset="utf-8" When the introspected VM is paused/suspended/migrated, the introspection tool removes its hooks from the guest and closes the connection. This is detected by KVM, which in turn will clean the introspection structures. Thanks to the reconnect parameter, the chardev will reconnect with the introspection tool, which will try to hook the VM again, assuming that the pause/suspend/migration operation has ended. With this new feature, we can suspend the reconnection. CC: "Marc-Andr=C3=A9 Lureau" CC: Paolo Bonzini Signed-off-by: Adalbert Laz=C4=83r --- chardev/char-fe.c | 11 +++++++++++ chardev/char-socket.c | 14 ++++++++++++++ include/chardev/char-fe.h | 7 +++++++ include/chardev/char.h | 1 + 4 files changed, 33 insertions(+) diff --git a/chardev/char-fe.c b/chardev/char-fe.c index f3530a90e6..ac83528078 100644 --- a/chardev/char-fe.c +++ b/chardev/char-fe.c @@ -384,3 +384,14 @@ void qemu_chr_fe_disconnect(CharBackend *be) CHARDEV_GET_CLASS(chr)->chr_disconnect(chr); } } + +int qemu_chr_fe_reconnect_time(CharBackend *be, int secs) +{ + Chardev *chr =3D be->chr; + + if (chr && CHARDEV_GET_CLASS(chr)->chr_reconnect_time) { + return CHARDEV_GET_CLASS(chr)->chr_reconnect_time(chr, secs); + } + + return -1; +} diff --git a/chardev/char-socket.c b/chardev/char-socket.c index 185fe38dda..bd966aace1 100644 --- a/chardev/char-socket.c +++ b/chardev/char-socket.c @@ -1471,6 +1471,19 @@ char_socket_get_connected(Object *obj, Error **errp) return s->state =3D=3D TCP_CHARDEV_STATE_CONNECTED; } =20 +static int tcp_chr_reconnect_time(Chardev *chr, int secs) +{ + SocketChardev *s =3D SOCKET_CHARDEV(chr); + + int old =3D s->reconnect_time; + + if (secs >=3D 0) { + s->reconnect_time =3D secs; + } + + return old; +} + static void char_socket_class_init(ObjectClass *oc, void *data) { ChardevClass *cc =3D CHARDEV_CLASS(oc); @@ -1481,6 +1494,7 @@ static void char_socket_class_init(ObjectClass *oc, v= oid *data) cc->chr_write =3D tcp_chr_write; cc->chr_sync_read =3D tcp_chr_sync_read; cc->chr_disconnect =3D tcp_chr_disconnect; + cc->chr_reconnect_time =3D tcp_chr_reconnect_time; cc->get_msgfds =3D tcp_get_msgfds; cc->set_msgfds =3D tcp_set_msgfds; cc->chr_add_client =3D tcp_chr_add_client; diff --git a/include/chardev/char-fe.h b/include/chardev/char-fe.h index a553843364..ff1897040a 100644 --- a/include/chardev/char-fe.h +++ b/include/chardev/char-fe.h @@ -135,6 +135,13 @@ void qemu_chr_fe_accept_input(CharBackend *be); */ void qemu_chr_fe_disconnect(CharBackend *be); =20 +/** + * qemu_chr_fe_reconnect_time: + * + * Change the reconnect time and return the old value. + */ +int qemu_chr_fe_reconnect_time(CharBackend *be, int secs); + /** * qemu_chr_fe_wait_connected: * diff --git a/include/chardev/char.h b/include/chardev/char.h index 00589a6025..80204d43ae 100644 --- a/include/chardev/char.h +++ b/include/chardev/char.h @@ -270,6 +270,7 @@ typedef struct ChardevClass { int (*chr_add_client)(Chardev *chr, int fd); int (*chr_wait_connected)(Chardev *chr, Error **errp); void (*chr_disconnect)(Chardev *chr); + int (*chr_reconnect_time)(Chardev *be, int secs); void (*chr_accept_input)(Chardev *chr); void (*chr_set_echo)(Chardev *chr, bool echo); void (*chr_set_fe_open)(Chardev *chr, int fe_open); From nobody Wed May 15 13:53:04 2024 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=1586912508; cv=none; d=zohomail.com; s=zohoarc; b=NK0dHv2Yr0H38zJMuvV90tjuuD51z/SKpdQ0Y7bk6zsvJTdTEa9qe0cuCaezmVmYSNYSeLtlkfcDFW4T2ggjtLU+iGjLW0ssna2KIR/Ciri7oBa82eoLp8mbpjfp04yCxQ58vyqys7EU+uJfvhsmpEb1QW5LGcBNmnde2koAP+g= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1586912508; 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=Yv5Cj9u+D6tV6+Bd2/tFXDzw564oAxkd1dShZRaq4EU=; b=K+Yu9cVYLnYGRFPoyvO8RsJaDTlLpELsGOcO6doY7VXOZfzG51I7/ofgwgGxZYQteI86yUubDN4MCB0qF/SF4Jm8MxG+fvXDAnh2WB5elKDkXqeqTGQBf5XV6jTmtdnVzcTOJeyCP3UZDln41EJAU+GpXHxnNyJMcqSIgzNwYnA= 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 1586912508841787.6117705008348; Tue, 14 Apr 2020 18:01:48 -0700 (PDT) Received: from localhost ([::1]:40886 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jOWR1-00038F-F8 for importer@patchew.org; Tue, 14 Apr 2020 21:01:47 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:58396) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jOWP1-000114-Ts for qemu-devel@nongnu.org; Tue, 14 Apr 2020 20:59:45 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1jOWOw-00050W-1Q for qemu-devel@nongnu.org; Tue, 14 Apr 2020 20:59:43 -0400 Received: from mx01.bbu.dsd.mx.bitdefender.com ([91.199.104.161]:48986) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1jOWOv-0004xw-L1 for qemu-devel@nongnu.org; Tue, 14 Apr 2020 20:59:37 -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 2AEFD30747BF; Wed, 15 Apr 2020 03:59:34 +0300 (EEST) Received: from localhost.localdomain (unknown [91.199.104.27]) by smtp.bitdefender.com (Postfix) with ESMTPSA id 08CCB305B7A1; Wed, 15 Apr 2020 03:59:34 +0300 (EEST) From: =?UTF-8?q?Adalbert=20Laz=C4=83r?= To: qemu-devel@nongnu.org Subject: [RFC PATCH v1 02/26] char-socket: allow vsock parameters (cid, port) Date: Wed, 15 Apr 2020 03:59:14 +0300 Message-Id: <20200415005938.23895-3-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?= , =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= , Paolo Bonzini Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Type: text/plain; charset="utf-8" The introspection tool can run in a separate VM and the introspected VM will establish a connection using a virtual socket. CC: "Marc-Andr=C3=A9 Lureau" CC: Paolo Bonzini Signed-off-by: Adalbert Laz=C4=83r --- chardev/char-socket.c | 27 ++++++++++++++++++++++++--- chardev/char.c | 3 +++ 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/chardev/char-socket.c b/chardev/char-socket.c index bd966aace1..9b2deb0125 100644 --- a/chardev/char-socket.c +++ b/chardev/char-socket.c @@ -23,6 +23,11 @@ */ =20 #include "qemu/osdep.h" + +#ifdef CONFIG_AF_VSOCK +#include +#endif /* CONFIG_AF_VSOCK */ + #include "chardev/char.h" #include "io/channel-socket.h" #include "io/channel-tls.h" @@ -590,6 +595,14 @@ static char *qemu_chr_compute_filename(SocketChardev *= s) s->is_listen ? ",server" : "", left, phost, right, pserv); =20 +#ifdef CONFIG_AF_VSOCK + case AF_VSOCK: + return g_strdup_printf("vsock:%d:%d%s", + ((struct sockaddr_vm *)(ss))->svm_cid, + ((struct sockaddr_vm *)(ss))->svm_port, + s->is_listen ? ",server" : ""); +#endif + default: return g_strdup_printf("unknown"); } @@ -1378,18 +1391,19 @@ static void qemu_chr_parse_socket(QemuOpts *opts, C= hardevBackend *backend, { const char *path =3D qemu_opt_get(opts, "path"); const char *host =3D qemu_opt_get(opts, "host"); + const char *cid =3D qemu_opt_get(opts, "cid"); const char *port =3D qemu_opt_get(opts, "port"); const char *fd =3D qemu_opt_get(opts, "fd"); SocketAddressLegacy *addr; ChardevSocket *sock; =20 - if ((!!path + !!fd + !!host) !=3D 1) { + if ((!!path + !!fd + !!host + !!cid) !=3D 1) { error_setg(errp, - "Exactly one of 'path', 'fd' or 'host' required"); + "Exactly one of 'path', 'fd', 'cid' or 'host' required"= ); return; } =20 - if (host && !port) { + if ((host || cid) && !port) { error_setg(errp, "chardev: socket: no port given"); return; } @@ -1444,6 +1458,13 @@ static void qemu_chr_parse_socket(QemuOpts *opts, Ch= ardevBackend *backend, .has_ipv6 =3D qemu_opt_get(opts, "ipv6"), .ipv6 =3D qemu_opt_get_bool(opts, "ipv6", 0), }; + } else if (cid) { + addr->type =3D SOCKET_ADDRESS_LEGACY_KIND_VSOCK; + addr->u.vsock.data =3D g_new0(VsockSocketAddress, 1); + *addr->u.vsock.data =3D (VsockSocketAddress) { + .cid =3D g_strdup(cid), + .port =3D g_strdup(port), + }; } else if (fd) { addr->type =3D SOCKET_ADDRESS_LEGACY_KIND_FD; addr->u.fd.data =3D g_new(String, 1); diff --git a/chardev/char.c b/chardev/char.c index e77564060d..39e36ceb97 100644 --- a/chardev/char.c +++ b/chardev/char.c @@ -852,6 +852,9 @@ QemuOptsList qemu_chardev_opts =3D { },{ .name =3D "host", .type =3D QEMU_OPT_STRING, + },{ + .name =3D "cid", + .type =3D QEMU_OPT_STRING, },{ .name =3D "port", .type =3D QEMU_OPT_STRING, From nobody Wed May 15 13:53:04 2024 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=1586912503; cv=none; d=zohomail.com; s=zohoarc; b=kWp7OvCm7npgedOVNlgkZv4hiFeHcdzAhDvvKHp5G+xxQr/Tb3njliPipTEYOFV0IqFsYZtSbc0YBqarWUrwhHwb1A44W2MeO+oQerfoEC2RcCjcOKqZh7EO/Lo5SZsCoWnYzpgxQj/qG0ZnJhMako1HGfmKNjTTK1A2mtBtmEc= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1586912503; 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=ycjkroRHLV2BnF2XRHd36OiyjxHlPqYYQGSnPycsbKk=; b=nbB9jVVFxtM08MP78NHAGVkmBJrLEP09toZmjw/N9yulu96NZd+miQlV01iefhpBeUIa6A+9QkfXujJ6c5XJ+g/Ky4eigMiV+W+NUsFFnoNSc/zA/UNrul5AQKXf43ZcMz9Sx7WEeSTEfdOq5TxWPw3ePHAwqyUqHFPlxL7DCHo= 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 1586912503386463.5798368432661; Tue, 14 Apr 2020 18:01:43 -0700 (PDT) Received: from localhost ([::1]:40880 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jOWQv-0002i7-9n for importer@patchew.org; Tue, 14 Apr 2020 21:01:41 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:58308) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jOWOx-0000vf-BL for qemu-devel@nongnu.org; Tue, 14 Apr 2020 20:59:40 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1jOWOv-000509-T6 for qemu-devel@nongnu.org; Tue, 14 Apr 2020 20:59:39 -0400 Received: from mx01.bbu.dsd.mx.bitdefender.com ([91.199.104.161]:48989) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1jOWOv-0004xv-Kx for qemu-devel@nongnu.org; Tue, 14 Apr 2020 20:59:37 -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 4413F30747C0; Wed, 15 Apr 2020 03:59:34 +0300 (EEST) Received: from localhost.localdomain (unknown [91.199.104.27]) by smtp.bitdefender.com (Postfix) with ESMTPSA id 29190305B7A2; Wed, 15 Apr 2020 03:59:34 +0300 (EEST) From: =?UTF-8?q?Adalbert=20Laz=C4=83r?= To: qemu-devel@nongnu.org Subject: [RFC PATCH v1 03/26] char-socket: fix the client mode when created through QMP Date: Wed, 15 Apr 2020 03:59:15 +0300 Message-Id: <20200415005938.23895-4-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?= , =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= , Paolo Bonzini Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Type: text/plain; charset="utf-8" qmp_chardev_open_socket() ignores the absence of the 'server' argument and always switches to listen/server mode. CC: "Marc-Andr=C3=A9 Lureau" CC: Paolo Bonzini Signed-off-by: Adalbert Laz=C4=83r --- chardev/char-socket.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chardev/char-socket.c b/chardev/char-socket.c index 9b2deb0125..fd0106ab85 100644 --- a/chardev/char-socket.c +++ b/chardev/char-socket.c @@ -1310,7 +1310,7 @@ static void qmp_chardev_open_socket(Chardev *chr, SocketChardev *s =3D SOCKET_CHARDEV(chr); ChardevSocket *sock =3D backend->u.socket.data; bool do_nodelay =3D sock->has_nodelay ? sock->nodelay : false; - bool is_listen =3D sock->has_server ? sock->server : true; + bool is_listen =3D sock->has_server ? sock->server : false; bool is_telnet =3D sock->has_telnet ? sock->telnet : false; bool is_tn3270 =3D sock->has_tn3270 ? sock->tn3270 : false; bool is_waitconnect =3D sock->has_wait ? sock->wait : false; From nobody Wed May 15 13:53:04 2024 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=1586912714; cv=none; d=zohomail.com; s=zohoarc; b=kdPQ4aDOF0tKTYu8Jtmz+Q7oR1kP7hehIWWtd2S4qZqAKIPd4DlcFot7BITmDCmOJbZi0F+JiSAdpXOYO2AtGzgKts7SdUExhgfgmsEgJZpa/VDL8CVopm0peq+L59Oc7QX+8UJGfeYLoEkT4TWGk2cXNqCJzUUwK22ip2nQQ1I= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1586912714; 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=jObyJziJ0IVLnb9xWgJ1/CAOwMOiyVElHZ4bz9qgrxQ=; b=ImfF73WdSXJjuPdFOPfY40QB0D87fd6Hkjhs6kOhfpwOlRk1mwootiSBC9Vrv/rNuuRK6P3D0HVMdSKBkhGZrepBj14BumDykYw3RYirJXSQA5kn7+kVR+bDEzNQoF+87zVnM4Li0CyUm+IcQP3NWF7r1VBac/SaK/k+MVrWJSg= 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 1586912714459486.26288732418345; Tue, 14 Apr 2020 18:05:14 -0700 (PDT) Received: from localhost ([::1]:40912 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jOWUL-0006QH-6C for importer@patchew.org; Tue, 14 Apr 2020 21:05:13 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:58307) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jOWOx-0000ve-BV for qemu-devel@nongnu.org; Tue, 14 Apr 2020 20:59:40 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1jOWOv-000504-T0 for qemu-devel@nongnu.org; Tue, 14 Apr 2020 20:59:38 -0400 Received: from mx01.bbu.dsd.mx.bitdefender.com ([91.199.104.161]:48988) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1jOWOv-0004xx-Kz for qemu-devel@nongnu.org; Tue, 14 Apr 2020 20:59:37 -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 5BD0F30747C2; Wed, 15 Apr 2020 03:59:34 +0300 (EEST) Received: from localhost.localdomain (unknown [91.199.104.27]) by smtp.bitdefender.com (Postfix) with ESMTPSA id 44546305B7A3; Wed, 15 Apr 2020 03:59:34 +0300 (EEST) From: =?UTF-8?q?Adalbert=20Laz=C4=83r?= To: qemu-devel@nongnu.org Subject: [RFC PATCH v1 04/26] char-socket: add 'reconnecting' property Date: Wed, 15 Apr 2020 03:59:16 +0300 Message-Id: <20200415005938.23895-5-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?= , =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= , Paolo Bonzini Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Type: text/plain; charset="utf-8" This is used by the VM introspection object to check if the connection will be reestablished in case it disconnects from some reason. The closing of the socket is used by any of the three parties involved, KVM, the introspection tool and QEMU (eg. on force-reset), to signal the other parties that the session is over. As such, it is very important that the socket will reconnect. CC: "Marc-Andr=C3=A9 Lureau" CC: Paolo Bonzini Signed-off-by: Adalbert Laz=C4=83r --- chardev/char-socket.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/chardev/char-socket.c b/chardev/char-socket.c index fd0106ab85..22ab242748 100644 --- a/chardev/char-socket.c +++ b/chardev/char-socket.c @@ -1492,6 +1492,13 @@ char_socket_get_connected(Object *obj, Error **errp) return s->state =3D=3D TCP_CHARDEV_STATE_CONNECTED; } =20 +static bool char_socket_get_reconnecting(Object *obj, Error **errp) +{ + SocketChardev *s =3D SOCKET_CHARDEV(obj); + + return s->reconnect_time > 0; +} + static int tcp_chr_reconnect_time(Chardev *chr, int secs) { SocketChardev *s =3D SOCKET_CHARDEV(chr); @@ -1528,6 +1535,10 @@ static void char_socket_class_init(ObjectClass *oc, = void *data) =20 object_class_property_add_bool(oc, "connected", char_socket_get_connec= ted, NULL, &error_abort); + + object_class_property_add_bool(oc, "reconnecting", + char_socket_get_reconnecting, + NULL, &error_abort); } =20 static const TypeInfo char_socket_type_info =3D { From nobody Wed May 15 13:53:04 2024 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=1586912919; cv=none; d=zohomail.com; s=zohoarc; b=XTe2FM3gWsYRjJuAqrPQzxB/HbdIHrQr6qbNtUImWIpqIuW8NHuTi6nDeR3MxAIS75TJ7jDDD9QhzU0henjXX+GhPLOBdJE20glr+CCPx7BcbPfKocgZJU7Xrg14UdmnOFkBOypMzKnS5DPFEtsBfAXrjwjUuVS5y1YLFPQKayo= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1586912918; 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=8rPLySro4pULm8HN1CIHAUI52W4QfURXtl4W0OUTyAE=; b=Kvdw+90UU0e6iSpfWC9nnLxQ/zq2i/Nt+Y+OGoyXW+A0X6Lh/6baD2Htb3CZn2OP171AwQLkKV2Rgo9vEziRFqvzkGDbO2DnWsV9z1lPk2j+ai5Dn7hd5yUM4JaS7EC9ZYAhPoK9UeeQlmb63oaCHzwWWb9GpRPdKZ9vLEn3jjI= 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 1586912918998759.8523485508642; Tue, 14 Apr 2020 18:08:38 -0700 (PDT) Received: from localhost ([::1]:40948 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jOWXd-0001sz-JH for importer@patchew.org; Tue, 14 Apr 2020 21:08:37 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:58353) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jOWOy-0000vq-Hf for qemu-devel@nongnu.org; Tue, 14 Apr 2020 20:59:41 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1jOWOx-00051k-Cb for qemu-devel@nongnu.org; Tue, 14 Apr 2020 20:59:40 -0400 Received: from mx01.bbu.dsd.mx.bitdefender.com ([91.199.104.161]:49078) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1jOWOx-00050k-41 for qemu-devel@nongnu.org; Tue, 14 Apr 2020 20:59:39 -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 7395430747C3; Wed, 15 Apr 2020 03:59:34 +0300 (EEST) Received: from localhost.localdomain (unknown [91.199.104.27]) by smtp.bitdefender.com (Postfix) with ESMTPSA id 5ACE2305B7A0; Wed, 15 Apr 2020 03:59:34 +0300 (EEST) From: =?UTF-8?q?Adalbert=20Laz=C4=83r?= To: qemu-devel@nongnu.org Subject: [RFC PATCH v1 05/26] char-socket: add 'fd' property Date: Wed, 15 Apr 2020 03:59:17 +0300 Message-Id: <20200415005938.23895-6-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?= , =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= , Paolo Bonzini Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Type: text/plain; charset="utf-8" This is used by the VM introspection object, after handshake, to hand over the file descriptor to KVM. CC: "Marc-Andr=C3=A9 Lureau" CC: Paolo Bonzini Signed-off-by: Adalbert Laz=C4=83r Reviewed-by: Marc-Andr=C3=A9 Lureau --- chardev/char-socket.c | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/chardev/char-socket.c b/chardev/char-socket.c index 22ab242748..76d0fb8839 100644 --- a/chardev/char-socket.c +++ b/chardev/char-socket.c @@ -1499,6 +1499,21 @@ static bool char_socket_get_reconnecting(Object *obj= , Error **errp) return s->reconnect_time > 0; } =20 +static void +char_socket_get_fd(Object *obj, Visitor *v, const char *name, void *opaque, + Error **errp) +{ + int fd =3D -1; + SocketChardev *s =3D SOCKET_CHARDEV(obj); + QIOChannelSocket *sock =3D QIO_CHANNEL_SOCKET(s->sioc); + + if (sock) { + fd =3D sock->fd; + } + + visit_type_int32(v, name, &fd, errp); +} + static int tcp_chr_reconnect_time(Chardev *chr, int secs) { SocketChardev *s =3D SOCKET_CHARDEV(chr); @@ -1539,6 +1554,9 @@ static void char_socket_class_init(ObjectClass *oc, v= oid *data) object_class_property_add_bool(oc, "reconnecting", char_socket_get_reconnecting, NULL, &error_abort); + + object_class_property_add(oc, "fd", "int32", char_socket_get_fd, + NULL, NULL, NULL, &error_abort); } =20 static const TypeInfo char_socket_type_info =3D { From nobody Wed May 15 13:53:04 2024 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=1586912505; cv=none; d=zohomail.com; s=zohoarc; b=S7Y4lm3Hgg/+0Rool7pdRfQyVJMsqdX9kqdUCYlxzMihdKr2SBFRTDpnhplX5L0qFxTM/tx5nXlAzy16zMvLFIUaYITgxP8GmADzNvD7K1nXS7bf46ACzq+2mDKFjDtFhDVj+GC9Aox5MLeJt2WjJNnO3PuGukDiNl15biovSCE= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1586912505; 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=tGvPKfs3DpT5w8s5/15ArUwhbCSCeV8Ez86lmFNheCM=; b=RH3S3/8UPpBKc9WlI0UgmTPLSUGtfnl87vwOBoSlPP7lasNXj3XE4K/JzsygreSeMYJeDHXRHrgPOXbSURCAkJuYnwd+YmwE/FTnfgZvPXyLDEc6NRf8v+Ozt6gU/AVycEuHZUUpNiMDIw8EVN41BM5bdrNIkJxVlq5xbGD7L18= 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 158691250519617.379942106144995; Tue, 14 Apr 2020 18:01:45 -0700 (PDT) Received: from localhost ([::1]:40882 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jOWQx-0002pz-HB for importer@patchew.org; Tue, 14 Apr 2020 21:01:43 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:58350) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jOWOy-0000vl-DP for qemu-devel@nongnu.org; Tue, 14 Apr 2020 20:59:41 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1jOWOx-00051g-CG for qemu-devel@nongnu.org; Tue, 14 Apr 2020 20:59:40 -0400 Received: from mx01.bbu.dsd.mx.bitdefender.com ([91.199.104.161]:49076) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1jOWOx-00050i-3h for qemu-devel@nongnu.org; Tue, 14 Apr 2020 20:59:39 -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 991FB30747C4; Wed, 15 Apr 2020 03:59:34 +0300 (EEST) Received: from localhost.localdomain (unknown [91.199.104.27]) by smtp.bitdefender.com (Postfix) with ESMTPSA id 76035305B7A1; Wed, 15 Apr 2020 03:59:34 +0300 (EEST) From: =?UTF-8?q?Adalbert=20Laz=C4=83r?= To: qemu-devel@nongnu.org Subject: [RFC PATCH v1 06/26] E820: extend the table access interface Date: Wed, 15 Apr 2020 03:59:18 +0300 Message-Id: <20200415005938.23895-7-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: Eduardo Habkost , "Michael S. Tsirkin" , =?UTF-8?q?Adalbert=20Laz=C4=83r?= , Paolo Bonzini , Richard Henderson Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Type: text/plain; charset="utf-8" This new function is necessary for the VM introspection object. By sending all e820 entries, not just the RAM ones, the introspection tool can differentiate between an invalid address and a reserved one. CC: Paolo Bonzini CC: Richard Henderson CC: Eduardo Habkost CC: "Michael S. Tsirkin" CC: Marcel Apfelbaum Signed-off-by: Adalbert Laz=C4=83r --- hw/i386/e820_memory_layout.c | 12 ++++++++++++ hw/i386/e820_memory_layout.h | 2 ++ 2 files changed, 14 insertions(+) diff --git a/hw/i386/e820_memory_layout.c b/hw/i386/e820_memory_layout.c index bcf9eaf837..a875e9e326 100644 --- a/hw/i386/e820_memory_layout.c +++ b/hw/i386/e820_memory_layout.c @@ -57,3 +57,15 @@ bool e820_get_entry(int idx, uint32_t type, uint64_t *ad= dress, uint64_t *length) } return false; } + +bool e820_get_entry2(int idx, uint32_t *type, uint64_t *address, + uint64_t *length) +{ + if (idx < e820_entries) { + *type =3D le32_to_cpu(e820_table[idx].type); + *address =3D le64_to_cpu(e820_table[idx].address); + *length =3D le64_to_cpu(e820_table[idx].length); + return true; + } + return false; +} diff --git a/hw/i386/e820_memory_layout.h b/hw/i386/e820_memory_layout.h index 2a0ceb8b9c..a4555c21fb 100644 --- a/hw/i386/e820_memory_layout.h +++ b/hw/i386/e820_memory_layout.h @@ -36,6 +36,8 @@ int e820_add_entry(uint64_t address, uint64_t length, uin= t32_t type); int e820_get_num_entries(void); bool e820_get_entry(int index, uint32_t type, uint64_t *address, uint64_t *length); +bool e820_get_entry2(int index, uint32_t *type, + uint64_t *address, uint64_t *length); =20 =20 =20 From nobody Wed May 15 13:53:04 2024 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=1586912716; cv=none; d=zohomail.com; s=zohoarc; b=G1886OBVUUHTZRudWPbcRzq+2uaeeNaVRwF2QRJdwjVyma06CWgRdm8YXY52DOM2ywcfoBHUzjLohxoGsAGT56J6MoNzyn4rVEtUT6TooKv1A23lkkm8gn6GBO1o39LJDGKlHqRJ8at73G0T3leSGPnwbnKLwL7jsmLCrJUNHQg= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1586912716; 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=Xgoq+fbHERjoU5ZRsydYW6cV8/jRsnoAAPW+uVZHNtc=; b=Dm+L4bO3YBlY2Y0ZV53Rb0PI7+8+l4i2NOz8umo7Hv4wxIOml0yqwUHCWK1c1sgb42zqfxGTU7tv/e+DlRYVBSUXwRcXxZJpUW8MQcmt78MGe2aP7zBpPbIHN2s+ctY/no+dqOsQMWQQx0TV2zPBvs8aIryBJtDg4x8h8uQk8Eo= 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 158691271609628.05064928401964; Tue, 14 Apr 2020 18:05:16 -0700 (PDT) Received: from localhost ([::1]:40914 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jOWUM-0006SF-NH for importer@patchew.org; Tue, 14 Apr 2020 21:05:14 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:58348) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jOWOy-0000vi-BT for qemu-devel@nongnu.org; Tue, 14 Apr 2020 20:59:41 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1jOWOx-00051S-B2 for qemu-devel@nongnu.org; Tue, 14 Apr 2020 20:59:40 -0400 Received: from mx01.bbu.dsd.mx.bitdefender.com ([91.199.104.161]:49080) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1jOWOx-00050m-3L for qemu-devel@nongnu.org; Tue, 14 Apr 2020 20:59:39 -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 A9D2230747C5 for ; Wed, 15 Apr 2020 03:59:34 +0300 (EEST) Received: from localhost.localdomain (unknown [91.199.104.27]) by smtp.bitdefender.com (Postfix) with ESMTPSA id 99641305B7A2; Wed, 15 Apr 2020 03:59:34 +0300 (EEST) From: =?UTF-8?q?Adalbert=20Laz=C4=83r?= To: qemu-devel@nongnu.org Subject: [RFC PATCH v1 07/26] linux-headers: update with VM introspection interface Date: Wed, 15 Apr 2020 03:59:19 +0300 Message-Id: <20200415005938.23895-8-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?= Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Type: text/plain; charset="utf-8" Signed-off-by: Adalbert Laz=C4=83r --- linux-headers/linux/kvm.h | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/linux-headers/linux/kvm.h b/linux-headers/linux/kvm.h index 265099100e..4e5d390640 100644 --- a/linux-headers/linux/kvm.h +++ b/linux-headers/linux/kvm.h @@ -1010,6 +1010,7 @@ struct kvm_ppc_resize_hpt { #define KVM_CAP_ARM_NISV_TO_USER 177 #define KVM_CAP_ARM_INJECT_EXT_DABT 178 #define KVM_CAP_S390_VCPU_RESETS 179 +#define KVM_CAP_INTROSPECTION 180 =20 #ifdef KVM_CAP_IRQ_ROUTING =20 @@ -1558,6 +1559,25 @@ struct kvm_sev_dbg { __u32 len; }; =20 +struct kvm_introspection_hook { + __s32 fd; + __u32 padding; + __u8 uuid[16]; +}; + +#define KVM_INTROSPECTION_HOOK _IOW(KVMIO, 0xc3, struct kvm_introspecti= on_hook) +#define KVM_INTROSPECTION_UNHOOK _IO(KVMIO, 0xc4) + +struct kvm_introspection_feature { + __u32 allow; + __s32 id; +}; + +#define KVM_INTROSPECTION_COMMAND _IOW(KVMIO, 0xc5, struct kvm_introspecti= on_feature) +#define KVM_INTROSPECTION_EVENT _IOW(KVMIO, 0xc6, struct kvm_introspecti= on_feature) + +#define KVM_INTROSPECTION_PREUNHOOK _IO(KVMIO, 0xc7) + #define KVM_DEV_ASSIGN_ENABLE_IOMMU (1 << 0) #define KVM_DEV_ASSIGN_PCI_2_3 (1 << 1) #define KVM_DEV_ASSIGN_MASK_INTX (1 << 2) From nobody Wed May 15 13:53:04 2024 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=1586912935; cv=none; d=zohomail.com; s=zohoarc; b=QJhINRkEXlfBcAwDgU01sRFPULMqvvKCo+3i4wMy7asPyvwFhc369U0gJZVlVo123m0WKEavaUEZKn+imDRkBjaAi5fF7ORnYY8mH8ln+MjAx1tYgUztZSDcqzswuw13r/1FolO4b1xL3ij8898Ds+DpDmvv1aRn7+wNLLuYs0M= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1586912935; 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=dMEaiVAlrquO9EHCCydCcqqxztXyvG/4HduQUjZ+3Ss=; b=KDcskwoUD+m5ZveZSiufymn166CH7GXWQkxXVsz39iWyfEZ0tUfsamDx6DECdR8AD24V6GQu2+cJNRLr56TZkKtLtmOY94XoVo1COgDDwbNz8ZRCTGaXrB9scq5CK9v8wM2nQfHch2v9mPlHQrWcnJQ2DMNarOZkchDb/PH2yl4= 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 1586912935642231.19361541719184; Tue, 14 Apr 2020 18:08:55 -0700 (PDT) Received: from localhost ([::1]:40950 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jOWXu-00020n-8g for importer@patchew.org; Tue, 14 Apr 2020 21:08:54 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:58358) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jOWOy-0000vw-Nc for qemu-devel@nongnu.org; Tue, 14 Apr 2020 20:59:41 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1jOWOx-000524-I9 for qemu-devel@nongnu.org; Tue, 14 Apr 2020 20:59:40 -0400 Received: from mx01.bbu.dsd.mx.bitdefender.com ([91.199.104.161]:49082) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1jOWOx-00050q-4G for qemu-devel@nongnu.org; Tue, 14 Apr 2020 20:59:39 -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 C2F0730747C6; Wed, 15 Apr 2020 03:59:34 +0300 (EEST) Received: from localhost.localdomain (unknown [91.199.104.27]) by smtp.bitdefender.com (Postfix) with ESMTPSA id AD7E7305B7A3; Wed, 15 Apr 2020 03:59:34 +0300 (EEST) From: =?UTF-8?q?Adalbert=20Laz=C4=83r?= To: qemu-devel@nongnu.org Subject: [RFC PATCH v1 08/26] kvm: add VM introspection usage documentation Date: Wed, 15 Apr 2020 03:59:20 +0300 Message-Id: <20200415005938.23895-9-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 Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Type: text/plain; charset="utf-8" From: Marian Rotariu Signed-off-by: Marian Rotariu Signed-off-by: Adalbert Laz=C4=83r --- qemu-options.hx | 76 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 76 insertions(+) diff --git a/qemu-options.hx b/qemu-options.hx index 16debd03cb..6c5618e310 100644 --- a/qemu-options.hx +++ b/qemu-options.hx @@ -5005,6 +5005,82 @@ SRST :: =20 (qemu) qom-set /objects/iothread1 poll-max-ns 100000 + + ``-object introspection,id=3Did,chardev=3Did[,key=3Did][,handshake_tim= eout=3Dseconds][,unhook_timeout=3Dseconds][,command=3Did[,...]][,event=3Did= [,...]]`` + Defines a VM Introspection (VMI) object that will connect to + an introspection tool, initiate the handshake and hand over the co= nnection + file descriptor to KVM. The introspection channel will be used by + the introspection tool to talk directly with KVM. If the VM is pau= sed + or migrated, QEMU will delay the action, signal KVM, which in turn= will + signal the introspection tool to remove its hooks (e.g. breakpoints + placed inside the guest). + + The ``chardev`` parameter provides the introspection channel. + This is the id of a previously created chardev socket, + with a non-zero reconnect parameter. + + The ``key`` parameter is an optional secret object used to + authenticate the instrospection tool. + + The ``handshake_timeout`` parameter specify how long will QEMU + wait for the introspection tool during handshake (default is + 10 seconds). + + The ``unhook_timeout` parameter specify how long will QEMU + wait for the introspection tool on pause/migrate (default is + 60 seconds). + + The ``command`` parameter specify an allowed introspection command. + It can be used multiple times. If omitted, all commands are + allowed. For example, ``command=3D10,command=3D8`` will allow the + introspection tool to use two commands, KVMI_VCPU_PAUSE(10) and + KVMI_VM_WRITE_PHYSICAL(8), in addition to those that are used + to query the API, which are always allowed (KVMI_GET_VERSION, + KVMI_VM_CHECK_COMMAND and KVMI_VM_CHECK_EVENT). + + The ``event` parameter specify an allowed introspection event. + It can be used multiple times. If omitted, all events + are allowed. For example, ``event=3D1,event=3D3`` will + allow the introspection tool to receive only two events, + KVMI_EVENT_PAUSE_VCPU(1) and KVMI_EVENT_BREAKPOINT(3). + + VM introspected through a unix socket: + + .. parsed-literal:: + + # |qemu_system_x86| \ + ...... + -chardev socket,id=3Dvmi_chardev,type=3Dunix,path=3D/tmp/= vmi-guest1.sock,reconnect=3D10 \ + -object introspection,id=3Dvmi,chardev=3Dvmi_chardev + + VM introspected by an authenticated introspection tool: + + .. parsed-literal:: + + # |qemu_system_x86| \ + ...... + -chardev socket,id=3Dvmi_chardev,type=3Dunix,path=3D/tmp/= vmi-guest1.sock,reconnect=3D10 \ + -object secret,id=3Dvmi_key,file=3D/etc/secret \ + -object introspection,id=3Dvmi,chardev=3Dvmi_chardev,key= =3Dvmi_key + + VM introspected through a virtual socket, with the introspection t= ool + listening on port 4321 from another VM started with cid=3D1234: + + .. parsed-literal:: + + # |qemu_system_x86| \ + ...... + -chardev socket,id=3Dvmi_chardev,type=3Dvsock,cid=3D1234,= port=3D4321,reconnect=3D10 \ + -object introspection,id=3Dvmi,chardev=3Dvmi_chardev + + VM running the introspection tool: + + .. parsed-literal:: + + # |qemu_system_x86| \ + ...... + -device vhost-vsock-pci,id=3Dvhost-vsock-pci0,guest-cid= =3D1234 + ERST =20 =20 From nobody Wed May 15 13:53:04 2024 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=1586913105; cv=none; d=zohomail.com; s=zohoarc; b=D/L6CCN0ghiU79LREh1Q8fKC/eOKeM4AKW7EIsp3s/13eJ/UlvAK6pHgyNAwVMQRCFgGF6+XtXHvZGa/XqLWE5hKfG75kyPcQDNYnYSW7GKpvXZ62EsQrb8UJaLZghkWXkSuBV7AhuEjz5BdZFjgL4yq0eQwaOydJgy1FZthvO8= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1586913105; 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=Rv+e7AIP2vyZRVEJ15RShPY/dcAJymNN4aVf26WSECc=; b=RkNOfabGJfwU5DvTWGz/GgsAWKaeW/F2aKRDLYghHEi7NINIj3q+9eP9OeyJrkoJ1sv0N9TqWI95GZTGXm1tUDgToqqdI127B6VbsVO0uhgayV1vWoEM4u7Sb0Hlx231hHQPOFcHBEcKvjs518ekQvQAVVElNh8LSD1cQvF3V4w= 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 1586913105916716.6109169047976; Tue, 14 Apr 2020 18:11:45 -0700 (PDT) Received: from localhost ([::1]:40986 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jOWae-0005qg-L0 for importer@patchew.org; Tue, 14 Apr 2020 21:11:44 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:58385) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jOWOz-0000wV-PF for qemu-devel@nongnu.org; Tue, 14 Apr 2020 20:59:43 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1jOWOx-00052D-JZ for qemu-devel@nongnu.org; Tue, 14 Apr 2020 20:59:41 -0400 Received: from mx01.bbu.dsd.mx.bitdefender.com ([91.199.104.161]:49084) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1jOWOx-00050t-75 for qemu-devel@nongnu.org; Tue, 14 Apr 2020 20:59:39 -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 0390F30747C7; Wed, 15 Apr 2020 03:59:35 +0300 (EEST) Received: from localhost.localdomain (unknown [91.199.104.27]) by smtp.bitdefender.com (Postfix) with ESMTPSA id C749B305B7A0; Wed, 15 Apr 2020 03:59:34 +0300 (EEST) From: =?UTF-8?q?Adalbert=20Laz=C4=83r?= To: qemu-devel@nongnu.org Subject: [RFC PATCH v1 09/26] kvm: introduce the VM introspection object Date: Wed, 15 Apr 2020 03:59:21 +0300 Message-Id: <20200415005938.23895-10-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?= , Paolo Bonzini , Marian Rotariu Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Type: text/plain; charset="utf-8" This is used to initiate the connection with the introspection tool and hand over the file descriptor to KVM. The object needs a chardev socket (in client mode) created with the 'reconnect' property set. CC: Paolo Bonzini Signed-off-by: Marian Rotariu Signed-off-by: Adalbert Laz=C4=83r --- accel/kvm/Makefile.objs | 1 + accel/kvm/vmi.c | 168 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 169 insertions(+) create mode 100644 accel/kvm/vmi.c diff --git a/accel/kvm/Makefile.objs b/accel/kvm/Makefile.objs index fdfa481578..5e85294eb3 100644 --- a/accel/kvm/Makefile.objs +++ b/accel/kvm/Makefile.objs @@ -1,2 +1,3 @@ obj-y +=3D kvm-all.o +obj-y +=3D vmi.o obj-$(call lnot,$(CONFIG_SEV)) +=3D sev-stub.o diff --git a/accel/kvm/vmi.c b/accel/kvm/vmi.c new file mode 100644 index 0000000000..883c666a2a --- /dev/null +++ b/accel/kvm/vmi.c @@ -0,0 +1,168 @@ +/* + * VM Introspection + * + * Copyright (C) 2017-2020 Bitdefender S.R.L. + * + * This work is licensed under the terms of the GNU GPL, version 2 or late= r. + * See the COPYING file in the top-level directory. + */ + +#include "qemu/osdep.h" +#include "qapi/error.h" +#include "qemu/error-report.h" +#include "qom/object_interfaces.h" +#include "sysemu/sysemu.h" +#include "sysemu/kvm.h" +#include "chardev/char.h" +#include "chardev/char-fe.h" + +typedef struct VMIntrospection { + Object parent_obj; + + Error *init_error; + + char *chardevid; + Chardev *chr; + + Notifier machine_ready; + bool created_from_command_line; +} VMIntrospection; + +#define TYPE_VM_INTROSPECTION "introspection" + +#define VM_INTROSPECTION(obj) \ + OBJECT_CHECK(VMIntrospection, (obj), TYPE_VM_INTROSPECTION) + +static Error *vm_introspection_init(VMIntrospection *i); + +static void machine_ready(Notifier *notifier, void *data) +{ + VMIntrospection *i =3D container_of(notifier, VMIntrospection, machine= _ready); + + i->init_error =3D vm_introspection_init(i); + if (i->init_error) { + Error *err =3D error_copy(i->init_error); + + error_report_err(err); + if (i->created_from_command_line) { + exit(1); + } + } +} + +static void complete(UserCreatable *uc, Error **errp) +{ + VMIntrospection *i =3D VM_INTROSPECTION(uc); + + if (!i->chardevid) { + error_setg(errp, "VMI: chardev is not set"); + return; + } + + i->machine_ready.notify =3D machine_ready; + qemu_add_machine_init_done_notifier(&i->machine_ready); + + /* + * If the introspection object is created while parsing the command li= ne, + * the machine_ready callback will be called later. At that time, + * it vm_introspection_init() fails, exit() will be called. + * + * If the introspection object is created through QMP, machine_init_do= ne + * is already set and qemu_add_machine_init_done_notifier() will + * call our machine_done() callback. If vm_introspection_init() fails, + * we don't call exit() and report the error back to the user. + */ + if (i->init_error) { + *errp =3D i->init_error; + i->init_error =3D NULL; + return; + } +} + +static void prop_set_chardev(Object *obj, const char *value, Error **errp) +{ + VMIntrospection *i =3D VM_INTROSPECTION(obj); + + g_free(i->chardevid); + i->chardevid =3D g_strdup(value); +} + +static void class_init(ObjectClass *oc, void *data) +{ + UserCreatableClass *uc =3D USER_CREATABLE_CLASS(oc); + + uc->complete =3D complete; +} + +static void instance_init(Object *obj) +{ + VMIntrospection *i =3D VM_INTROSPECTION(obj); + + i->created_from_command_line =3D (qdev_hotplug =3D=3D false); + + object_property_add_str(obj, "chardev", NULL, prop_set_chardev, NULL); +} + +static void instance_finalize(Object *obj) +{ + VMIntrospection *i =3D VM_INTROSPECTION(obj); + + g_free(i->chardevid); + + error_free(i->init_error); +} + +static const TypeInfo info =3D { + .name =3D TYPE_VM_INTROSPECTION, + .parent =3D TYPE_OBJECT, + .class_init =3D class_init, + .instance_size =3D sizeof(VMIntrospection), + .instance_finalize =3D instance_finalize, + .instance_init =3D instance_init, + .interfaces =3D (InterfaceInfo[]){ + {TYPE_USER_CREATABLE}, + {} + } +}; + +static void register_types(void) +{ + type_register_static(&info); +} + +type_init(register_types); + +static Error *vm_introspection_init(VMIntrospection *i) +{ + Error *err =3D NULL; + int kvmi_version; + Chardev *chr; + + if (!kvm_enabled()) { + error_setg(&err, "VMI: missing KVM support"); + return err; + } + + kvmi_version =3D kvm_check_extension(kvm_state, KVM_CAP_INTROSPECTION); + if (kvmi_version =3D=3D 0) { + error_setg(&err, + "VMI: missing kernel built with CONFIG_KVM_INTROSPECTIO= N"); + return err; + } + + chr =3D qemu_chr_find(i->chardevid); + if (!chr) { + error_setg(&err, "VMI: device '%s' not found", i->chardevid); + return err; + } + + if (!object_property_get_bool(OBJECT(chr), "reconnecting", &err)) { + error_append_hint(&err, "VMI: missing reconnect=3DN for '%s'", + i->chardevid); + return err; + } + + i->chr =3D chr; + + return NULL; +} From nobody Wed May 15 13:53:04 2024 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=1586913320; cv=none; d=zohomail.com; s=zohoarc; b=h26WCCsOgod7mfDHMI3OM19roCfCjhuD5T/1AIXhtjv8Mh2OtOv9hMjHZjNxVJJuv/BH+hNh0HG6QoDbLk1EjkIdWHNt7KU3zR1PgN1alGQ5hFk4DAZnfzH5Nw2jDFhJIIrgOznGuemyAqt4b6g4ru85OljWsXWqBIwR8S2krqQ= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1586913320; 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=Kmnji9cxjIIJMiZbibOcIm4LfS9DpRj009yFkAjyyAY=; b=P04VeD7YFIXtmeFe3nZBud13N+LyVuRRFbVx2VrbRCoiw70KFveVqX50WQ/YGqZAr1KPYQcCAfjjsSNzcz2U2RAP6KQFiaGhBcHHu2jmeAu6uuuaCs7HId1ugZc3ReM/rTPEME9rVibyUxWdvbIDnY4Li7wcwYeALoKh9nkQeHk= 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 1586913320969377.1720309764513; Tue, 14 Apr 2020 18:15:20 -0700 (PDT) Received: from localhost ([::1]:41040 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jOWe7-0004r9-Js for importer@patchew.org; Tue, 14 Apr 2020 21:15:19 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:58502) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jOWPB-0001Mz-4Z for qemu-devel@nongnu.org; Tue, 14 Apr 2020 20:59:56 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1jOWP7-0005BY-MB 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]:49086) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1jOWP7-00050u-8J for qemu-devel@nongnu.org; Tue, 14 Apr 2020 20:59:49 -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 11C7830747C8 for ; Wed, 15 Apr 2020 03:59:35 +0300 (EEST) Received: from localhost.localdomain (unknown [91.199.104.27]) by smtp.bitdefender.com (Postfix) with ESMTPSA id F0C46305B7A1; Wed, 15 Apr 2020 03:59:34 +0300 (EEST) From: =?UTF-8?q?Adalbert=20Laz=C4=83r?= To: qemu-devel@nongnu.org Subject: [RFC PATCH v1 10/26] kvm: vmi: add the handshake with the introspection tool Date: Wed, 15 Apr 2020 03:59:22 +0300 Message-Id: <20200415005938.23895-11-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?= Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Type: text/plain; charset="utf-8" QEMU sends the name, the UUID and the VM start time and expects the hash of a secret shared with the introspection tool that can be used to authenticate it. Signed-off-by: Adalbert Laz=C4=83r --- accel/kvm/vmi.c | 290 +++++++++++++++++++++++++++++++++ include/sysemu/vmi-handshake.h | 45 +++++ 2 files changed, 335 insertions(+) create mode 100644 include/sysemu/vmi-handshake.h diff --git a/accel/kvm/vmi.c b/accel/kvm/vmi.c index 883c666a2a..57ded2f69c 100644 --- a/accel/kvm/vmi.c +++ b/accel/kvm/vmi.c @@ -8,6 +8,7 @@ */ =20 #include "qemu/osdep.h" +#include "qemu-common.h" #include "qapi/error.h" #include "qemu/error-report.h" #include "qom/object_interfaces.h" @@ -16,6 +17,8 @@ #include "chardev/char.h" #include "chardev/char-fe.h" =20 +#include "sysemu/vmi-handshake.h" + typedef struct VMIntrospection { Object parent_obj; =20 @@ -23,9 +26,19 @@ typedef struct VMIntrospection { =20 char *chardevid; Chardev *chr; + CharBackend sock; + int sock_fd; + + qemu_vmi_from_introspector hsk_in; + uint64_t hsk_in_read_pos; + uint64_t hsk_in_read_size; + + int64_t vm_start_time; =20 Notifier machine_ready; bool created_from_command_line; + + bool kvmi_hooked; } VMIntrospection; =20 #define TYPE_VM_INTROSPECTION "introspection" @@ -50,6 +63,11 @@ static void machine_ready(Notifier *notifier, void *data) } } =20 +static void update_vm_start_time(VMIntrospection *i) +{ + i->vm_start_time =3D qemu_clock_get_ms(QEMU_CLOCK_REALTIME); +} + static void complete(UserCreatable *uc, Error **errp) { VMIntrospection *i =3D VM_INTROSPECTION(uc); @@ -87,6 +105,13 @@ static void prop_set_chardev(Object *obj, const char *v= alue, Error **errp) i->chardevid =3D g_strdup(value); } =20 +static bool chardev_is_connected(VMIntrospection *i, Error **errp) +{ + Object *obj =3D OBJECT(i->chr); + + return obj && object_property_get_bool(obj, "connected", errp); +} + static void class_init(ObjectClass *oc, void *data) { UserCreatableClass *uc =3D USER_CREATABLE_CLASS(oc); @@ -98,17 +123,60 @@ static void instance_init(Object *obj) { VMIntrospection *i =3D VM_INTROSPECTION(obj); =20 + i->sock_fd =3D -1; i->created_from_command_line =3D (qdev_hotplug =3D=3D false); =20 + update_vm_start_time(i); + object_property_add_str(obj, "chardev", NULL, prop_set_chardev, NULL); } =20 +static void disconnect_chardev(VMIntrospection *i) +{ + if (chardev_is_connected(i, NULL)) { + qemu_chr_fe_disconnect(&i->sock); + } +} + +static void unhook_kvmi(VMIntrospection *i) +{ + if (i->kvmi_hooked) { + if (kvm_vm_ioctl(kvm_state, KVM_INTROSPECTION_UNHOOK, NULL)) { + error_report("VMI: ioctl/KVM_INTROSPECTION_UNHOOK failed, errn= o %d", + errno); + } + i->kvmi_hooked =3D false; + } +} + +static void shutdown_socket_fd(VMIntrospection *i) +{ + /* signal both ends (kernel, introspector) */ + if (i->sock_fd !=3D -1) { + shutdown(i->sock_fd, SHUT_RDWR); + i->sock_fd =3D -1; + } +} + +static void disconnect_and_unhook_kvmi(VMIntrospection *i) +{ + shutdown_socket_fd(i); + disconnect_chardev(i); + unhook_kvmi(i); +} + static void instance_finalize(Object *obj) { VMIntrospection *i =3D VM_INTROSPECTION(obj); =20 g_free(i->chardevid); =20 + if (i->chr) { + shutdown_socket_fd(i); + qemu_chr_fe_deinit(&i->sock, true); + unhook_kvmi(i); + } + error_free(i->init_error); } =20 @@ -132,6 +200,210 @@ static void register_types(void) =20 type_init(register_types); =20 +static bool send_handshake_info(VMIntrospection *i, Error **errp) +{ + qemu_vmi_to_introspector send =3D {}; + const char *vm_name; + int r; + + send.struct_size =3D sizeof(send); + send.start_time =3D i->vm_start_time; + memcpy(&send.uuid, &qemu_uuid, sizeof(send.uuid)); + vm_name =3D qemu_get_vm_name(); + if (vm_name) { + snprintf(send.name, sizeof(send.name), "%s", vm_name); + send.name[sizeof(send.name) - 1] =3D 0; + } + + r =3D qemu_chr_fe_write_all(&i->sock, (uint8_t *)&send, sizeof(send)); + if (r !=3D sizeof(send)) { + error_setg_errno(errp, errno, "VMI: error writing to '%s'", + i->chardevid); + return false; + } + + /* tcp_chr_write may call tcp_chr_disconnect/CHR_EVENT_CLOSED */ + if (!chardev_is_connected(i, errp)) { + error_append_hint(errp, "VMI: qemu_chr_fe_write_all() failed"); + return false; + } + + return true; +} + +static bool validate_handshake(VMIntrospection *i, Error **errp) +{ + uint32_t min_accepted_size; + + min_accepted_size =3D offsetof(qemu_vmi_from_introspector, cookie_hash) + + QEMU_VMI_COOKIE_HASH_SIZE; + + if (i->hsk_in.struct_size < min_accepted_size) { + error_setg(errp, "VMI: not enough or invalid handshake data"); + return false; + } + + /* + * Check hsk_in.struct_size and sizeof(hsk_in) before accessing any + * other fields. We might get fewer bytes from applications using + * old versions if we extended the qemu_vmi_from_introspector structur= e. + */ + + return true; +} + +static bool connect_kernel(VMIntrospection *i, Error **errp) +{ + struct kvm_introspection_feature commands, events; + struct kvm_introspection_hook kernel; + const __s32 all_ids =3D -1; + + memset(&kernel, 0, sizeof(kernel)); + memcpy(kernel.uuid, &qemu_uuid, sizeof(kernel.uuid)); + kernel.fd =3D i->sock_fd; + + if (kvm_vm_ioctl(kvm_state, KVM_INTROSPECTION_HOOK, &kernel)) { + error_setg_errno(errp, -errno, + "VMI: ioctl/KVM_INTROSPECTION_HOOK failed"); + if (errno =3D=3D -EPERM) { + error_append_hint(errp, + "Reload the kvm module with kvm.introspectio= n=3Don"); + } + return false; + } + + i->kvmi_hooked =3D true; + + commands.allow =3D 1; + commands.id =3D all_ids; + if (kvm_vm_ioctl(kvm_state, KVM_INTROSPECTION_COMMAND, &commands)) { + error_setg_errno(errp, -errno, + "VMI: ioctl/KVM_INTROSPECTION_COMMAND failed"); + unhook_kvmi(i); + return false; + } + + events.allow =3D 1; + events.id =3D all_ids; + if (kvm_vm_ioctl(kvm_state, KVM_INTROSPECTION_EVENT, &events)) { + error_setg_errno(errp, -errno, + "VMI: ioctl/KVM_INTROSPECTION_EVENT failed"); + unhook_kvmi(i); + return false; + } + + return true; +} + +/* + * We should read only the handshake structure, + * which might have a different size than what we expect. + */ +static int chr_can_read(void *opaque) +{ + VMIntrospection *i =3D opaque; + + if (i->sock_fd =3D=3D -1) { + return 0; + } + + /* first, we read the incoming structure size */ + if (i->hsk_in_read_pos =3D=3D 0) { + return sizeof(i->hsk_in.struct_size); + } + + /* validate the incoming structure size */ + if (i->hsk_in.struct_size < sizeof(i->hsk_in.struct_size)) { + return 0; + } + + /* read the rest of the incoming structure */ + return i->hsk_in.struct_size - i->hsk_in_read_pos; +} + +static bool enough_bytes_for_handshake(VMIntrospection *i) +{ + return i->hsk_in_read_pos >=3D sizeof(i->hsk_in.struct_size) + && i->hsk_in_read_size =3D=3D i->hsk_in.struct_size; +} + +static void validate_and_connect(VMIntrospection *i) +{ + Error *local_err =3D NULL; + + if (!validate_handshake(i, &local_err) || !connect_kernel(i, &local_er= r)) { + error_append_hint(&local_err, "reconnecting\n"); + warn_report_err(local_err); + disconnect_chardev(i); + } +} + +static void chr_read(void *opaque, const uint8_t *buf, int size) +{ + VMIntrospection *i =3D opaque; + size_t to_read; + + i->hsk_in_read_size +=3D size; + + to_read =3D sizeof(i->hsk_in) - i->hsk_in_read_pos; + if (to_read > size) { + to_read =3D size; + } + + if (to_read) { + memcpy((uint8_t *)&i->hsk_in + i->hsk_in_read_pos, buf, to_read); + i->hsk_in_read_pos +=3D to_read; + } + + if (enough_bytes_for_handshake(i)) { + validate_and_connect(i); + } +} + +static void chr_event_open(VMIntrospection *i) +{ + Error *local_err =3D NULL; + + if (!send_handshake_info(i, &local_err)) { + error_append_hint(&local_err, "reconnecting\n"); + warn_report_err(local_err); + disconnect_chardev(i); + return; + } + + info_report("VMI: introspection tool connected"); + + i->sock_fd =3D object_property_get_int(OBJECT(i->chr), "fd", NULL); + + memset(&i->hsk_in, 0, sizeof(i->hsk_in)); + i->hsk_in_read_pos =3D 0; + i->hsk_in_read_size =3D 0; +} + +static void chr_event_close(VMIntrospection *i) +{ + if (i->sock_fd !=3D -1) { + warn_report("VMI: introspection tool disconnected"); + disconnect_and_unhook_kvmi(i); + } +} + +static void chr_event(void *opaque, QEMUChrEvent event) +{ + VMIntrospection *i =3D opaque; + + switch (event) { + case CHR_EVENT_OPENED: + chr_event_open(i); + break; + case CHR_EVENT_CLOSED: + chr_event_close(i); + break; + default: + break; + } +} + static Error *vm_introspection_init(VMIntrospection *i) { Error *err =3D NULL; @@ -162,7 +434,25 @@ static Error *vm_introspection_init(VMIntrospection *i) return err; } =20 + if (!qemu_chr_fe_init(&i->sock, chr, &err)) { + error_append_hint(&err, "VMI: device '%s' not initialized", + i->chardevid); + return err; + } + i->chr =3D chr; =20 + qemu_chr_fe_set_handlers(&i->sock, chr_can_read, chr_read, chr_event, + NULL, i, NULL, true); + + /* + * The reconnect timer is triggered by either machine init or by a cha= rdev + * disconnect. For the QMP creation, when the machine is already start= ed, + * use an artificial disconnect just to restart the timer. + */ + if (!i->created_from_command_line) { + qemu_chr_fe_disconnect(&i->sock); + } + return NULL; } diff --git a/include/sysemu/vmi-handshake.h b/include/sysemu/vmi-handshake.h new file mode 100644 index 0000000000..19bdfb6740 --- /dev/null +++ b/include/sysemu/vmi-handshake.h @@ -0,0 +1,45 @@ +/* + * QEMU VM Introspection Handshake + * + */ + +#ifndef QEMU_VMI_HANDSHAKE_H +#define QEMU_VMI_HANDSHAKE_H + +enum { QEMU_VMI_NAME_SIZE =3D 64 }; +enum { QEMU_VMI_COOKIE_HASH_SIZE =3D 20}; + +/** + * qemu_vmi_to_introspector: + * + * This structure is passed to the introspection tool during the handshake. + * + * @struct_size: the structure size + * @uuid: the UUID + * @start_time: the VM start time + * @name: the VM name + */ +typedef struct qemu_vmi_to_introspector { + uint32_t struct_size; + uint8_t uuid[16]; + uint32_t padding; + int64_t start_time; + char name[QEMU_VMI_NAME_SIZE]; + /* ... */ +} qemu_vmi_to_introspector; + +/** + * qemu_vmi_from_introspector: + * + * This structure is passed by the introspection tool during the handshake. + * + * @struct_size: the structure size + * @cookie_hash: the hash of the cookie know by the introspection tool + */ +typedef struct qemu_vmi_from_introspector { + uint32_t struct_size; + uint8_t cookie_hash[QEMU_VMI_COOKIE_HASH_SIZE]; + /* ... */ +} qemu_vmi_from_introspector; + +#endif /* QEMU_VMI_HANDSHAKE_H */ From nobody Wed May 15 13:53:04 2024 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=1586913102; cv=none; d=zohomail.com; s=zohoarc; b=U46Vsmu6bXFbYqVKzJXl/oyQJ7s5+FsyYg6eFkBlTFzfKwydpoqit7z+/60gLefDUSH1MFb1S8Yb3IUQ+d9UACw1McwvEPi6c30QadcO1zklfUBHGy1QPzI+bkpJHIxuuTZYOIgUUZhNf8oxscQI4a+Q2SieKNFxQgKxv91+z4o= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1586913102; 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=nWtJPk3wowdZSO2BUNY83ee6fXVeuV9jcnadxHLi3Hw=; b=Oz79zgMC+/P/gwPu5nlR0Gzr/4Cg5EPz9Bo9lnLLOljPBCTknBI76X86btIGnO9RQ8buiuSWcQsCK5OOnAclO2Ej45DxqnNOynaBkOK0hwyB/OxqQL1rZW1esqcnTMGFR+zShEFr7tE2qulf6UorSCVjgnXpRuRe9olvKpAse98= 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 1586913102845190.84574154619418; Tue, 14 Apr 2020 18:11:42 -0700 (PDT) Received: from localhost ([::1]:40984 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jOWab-0005c8-LC for importer@patchew.org; Tue, 14 Apr 2020 21:11:41 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:58435) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jOWP9-0001Hi-2a for qemu-devel@nongnu.org; Tue, 14 Apr 2020 20:59:52 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1jOWP7-0005Bd-MF for qemu-devel@nongnu.org; Tue, 14 Apr 2020 20:59:50 -0400 Received: from mx01.bbu.dsd.mx.bitdefender.com ([91.199.104.161]:49088) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1jOWP7-00050x-9E for qemu-devel@nongnu.org; Tue, 14 Apr 2020 20:59:49 -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 2809C30747C9 for ; Wed, 15 Apr 2020 03:59:35 +0300 (EEST) Received: from localhost.localdomain (unknown [91.199.104.27]) by smtp.bitdefender.com (Postfix) with ESMTPSA id 148FB305B7A2; Wed, 15 Apr 2020 03:59:35 +0300 (EEST) From: =?UTF-8?q?Adalbert=20Laz=C4=83r?= To: qemu-devel@nongnu.org Subject: [RFC PATCH v1 11/26] kvm: vmi: add 'handshake_timeout' property Date: Wed, 15 Apr 2020 03:59:23 +0300 Message-Id: <20200415005938.23895-12-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?= Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Type: text/plain; charset="utf-8" By having a timer during handshake, the blocked connections can be restored. Signed-off-by: Adalbert Laz=C4=83r --- accel/kvm/vmi.c | 66 ++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 65 insertions(+), 1 deletion(-) diff --git a/accel/kvm/vmi.c b/accel/kvm/vmi.c index 57ded2f69c..5659663caa 100644 --- a/accel/kvm/vmi.c +++ b/accel/kvm/vmi.c @@ -19,6 +19,8 @@ =20 #include "sysemu/vmi-handshake.h" =20 +#define HANDSHAKE_TIMEOUT_SEC 10 + typedef struct VMIntrospection { Object parent_obj; =20 @@ -32,6 +34,8 @@ typedef struct VMIntrospection { qemu_vmi_from_introspector hsk_in; uint64_t hsk_in_read_pos; uint64_t hsk_in_read_size; + GSource *hsk_timer; + uint32_t handshake_timeout; =20 int64_t vm_start_time; =20 @@ -105,6 +109,26 @@ static void prop_set_chardev(Object *obj, const char *= value, Error **errp) i->chardevid =3D g_strdup(value); } =20 +static void prop_get_uint32(Object *obj, Visitor *v, const char *name, + void *opaque, Error **errp) +{ + uint32_t *value =3D opaque; + + visit_type_uint32(v, name, value, errp); +} + +static void prop_set_uint32(Object *obj, Visitor *v, const char *name, + void *opaque, Error **errp) +{ + uint32_t *value =3D opaque; + Error *local_err =3D NULL; + + visit_type_uint32(v, name, value, &local_err); + if (local_err) { + error_propagate(errp, local_err); + } +} + static bool chardev_is_connected(VMIntrospection *i, Error **errp) { Object *obj =3D OBJECT(i->chr); @@ -129,6 +153,11 @@ static void instance_init(Object *obj) update_vm_start_time(i); =20 object_property_add_str(obj, "chardev", NULL, prop_set_chardev, NULL); + + i->handshake_timeout =3D HANDSHAKE_TIMEOUT_SEC; + object_property_add(obj, "handshake_timeout", "uint32", + prop_set_uint32, prop_get_uint32, + NULL, &i->handshake_timeout, NULL); } =20 static void disconnect_chardev(VMIntrospection *i) @@ -165,12 +194,28 @@ static void disconnect_and_unhook_kvmi(VMIntrospectio= n *i) unhook_kvmi(i); } =20 +static void cancel_timer(GSource *timer) +{ + if (timer) { + g_source_destroy(timer); + g_source_unref(timer); + } +} + +static void cancel_handshake_timer(VMIntrospection *i) +{ + cancel_timer(i->hsk_timer); + i->hsk_timer =3D NULL; +} + static void instance_finalize(Object *obj) { VMIntrospection *i =3D VM_INTROSPECTION(obj); =20 g_free(i->chardevid); =20 + cancel_handshake_timer(i); + if (i->chr) { shutdown_socket_fd(i); qemu_chr_fe_deinit(&i->sock, true); @@ -303,7 +348,7 @@ static int chr_can_read(void *opaque) { VMIntrospection *i =3D opaque; =20 - if (i->sock_fd =3D=3D -1) { + if (i->hsk_timer =3D=3D NULL || i->sock_fd =3D=3D -1) { return 0; } =20 @@ -356,10 +401,24 @@ static void chr_read(void *opaque, const uint8_t *buf= , int size) } =20 if (enough_bytes_for_handshake(i)) { + cancel_handshake_timer(i); validate_and_connect(i); } } =20 +static gboolean chr_timeout(gpointer opaque) +{ + VMIntrospection *i =3D opaque; + + warn_report("VMI: the handshake takes too long"); + + g_source_unref(i->hsk_timer); + i->hsk_timer =3D NULL; + + disconnect_and_unhook_kvmi(i); + return FALSE; +} + static void chr_event_open(VMIntrospection *i) { Error *local_err =3D NULL; @@ -378,6 +437,9 @@ static void chr_event_open(VMIntrospection *i) memset(&i->hsk_in, 0, sizeof(i->hsk_in)); i->hsk_in_read_pos =3D 0; i->hsk_in_read_size =3D 0; + i->hsk_timer =3D qemu_chr_timeout_add_ms(i->chr, + i->handshake_timeout * 1000, + chr_timeout, i); } =20 static void chr_event_close(VMIntrospection *i) @@ -386,6 +448,8 @@ static void chr_event_close(VMIntrospection *i) warn_report("VMI: introspection tool disconnected"); disconnect_and_unhook_kvmi(i); } + + cancel_handshake_timer(i); } =20 static void chr_event(void *opaque, QEMUChrEvent event) From nobody Wed May 15 13:53:04 2024 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=1586913313; cv=none; d=zohomail.com; s=zohoarc; b=Xz3pTlDVLY+2x/thavZBjWdrcWMWzFRcFMoUMav9mM9OpdrxsmW8RTisMKkcCBpvMRWBkK9shX8A5afS8uEE4Z6UrPG37mZZJs3lbxVKG3rJbuuHEKwY/UP6sN53kCu5VrkM5o2TlftpeY8c9NZfKkcUH+EXO3tjKJhINng0wFk= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1586913313; 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=yWW+47sQ4Xi1GPf9rVyRvgR0aKPut33rw78Ncvja2So=; b=lHfQ5AsuazLyf41CUr99qeVbCvhoWyjczihNBWoyp75dx/DBHhK5CKQCHSPIrBhJq+0LoGDwtSn1ceXhNhHw1570Md3sFhEZiFpoRXuHo4MU3lxaekV9t+qiRdZhgaUB0NbWTJWGr1GF6mOxFwWRITn74yuPm9p2whJ8rwpq73Y= 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 1586913313023924.0964763092392; Tue, 14 Apr 2020 18:15:13 -0700 (PDT) Received: from localhost ([::1]:41032 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jOWdz-0004a9-O4 for importer@patchew.org; Tue, 14 Apr 2020 21:15:11 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:58490) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jOWPA-0001LV-IP for qemu-devel@nongnu.org; Tue, 14 Apr 2020 20:59:54 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1jOWP8-0005CD-VH for qemu-devel@nongnu.org; Tue, 14 Apr 2020 20:59:52 -0400 Received: from mx01.bbu.dsd.mx.bitdefender.com ([91.199.104.161]:49090) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1jOWP7-00050y-8s for qemu-devel@nongnu.org; Tue, 14 Apr 2020 20:59:50 -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 3B5A430747CA for ; Wed, 15 Apr 2020 03:59:35 +0300 (EEST) Received: from localhost.localdomain (unknown [91.199.104.27]) by smtp.bitdefender.com (Postfix) with ESMTPSA id 2B8C1305B7A3; Wed, 15 Apr 2020 03:59:35 +0300 (EEST) From: =?UTF-8?q?Adalbert=20Laz=C4=83r?= To: qemu-devel@nongnu.org Subject: [RFC PATCH v1 12/26] kvm: vmi: add 'key' property Date: Wed, 15 Apr 2020 03:59:24 +0300 Message-Id: <20200415005938.23895-13-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?= Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Type: text/plain; charset="utf-8" The introspection tool can be authenticated if the 'key' parameter is set with the ID of a secret object holding a shared secret between the introspection tool and QEMU of the introspected VM. Signed-off-by: Adalbert Laz=C4=83r --- accel/kvm/vmi.c | 66 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) diff --git a/accel/kvm/vmi.c b/accel/kvm/vmi.c index 5659663caa..f456ca56ef 100644 --- a/accel/kvm/vmi.c +++ b/accel/kvm/vmi.c @@ -14,6 +14,8 @@ #include "qom/object_interfaces.h" #include "sysemu/sysemu.h" #include "sysemu/kvm.h" +#include "crypto/secret.h" +#include "crypto/hash.h" #include "chardev/char.h" #include "chardev/char-fe.h" =20 @@ -31,6 +33,11 @@ typedef struct VMIntrospection { CharBackend sock; int sock_fd; =20 + char *keyid; + Object *key; + uint8_t cookie_hash[QEMU_VMI_COOKIE_HASH_SIZE]; + bool key_with_cookie; + qemu_vmi_from_introspector hsk_in; uint64_t hsk_in_read_pos; uint64_t hsk_in_read_size; @@ -109,6 +116,14 @@ static void prop_set_chardev(Object *obj, const char *= value, Error **errp) i->chardevid =3D g_strdup(value); } =20 +static void prop_set_key(Object *obj, const char *value, Error **errp) +{ + VMIntrospection *i =3D VM_INTROSPECTION(obj); + + g_free(i->keyid); + i->keyid =3D g_strdup(value); +} + static void prop_get_uint32(Object *obj, Visitor *v, const char *name, void *opaque, Error **errp) { @@ -153,6 +168,7 @@ static void instance_init(Object *obj) update_vm_start_time(i); =20 object_property_add_str(obj, "chardev", NULL, prop_set_chardev, NULL); + object_property_add_str(obj, "key", NULL, prop_set_key, NULL); =20 i->handshake_timeout =3D HANDSHAKE_TIMEOUT_SEC; object_property_add(obj, "handshake_timeout", "uint32", @@ -213,6 +229,7 @@ static void instance_finalize(Object *obj) VMIntrospection *i =3D VM_INTROSPECTION(obj); =20 g_free(i->chardevid); + g_free(i->keyid); =20 cancel_handshake_timer(i); =20 @@ -276,6 +293,16 @@ static bool send_handshake_info(VMIntrospection *i, Er= ror **errp) return true; } =20 +static bool validate_handshake_cookie(VMIntrospection *i) +{ + if (!i->key_with_cookie) { + return true; + } + + return 0 =3D=3D memcmp(&i->cookie_hash, &i->hsk_in.cookie_hash, + sizeof(i->cookie_hash)); +} + static bool validate_handshake(VMIntrospection *i, Error **errp) { uint32_t min_accepted_size; @@ -288,6 +315,11 @@ static bool validate_handshake(VMIntrospection *i, Err= or **errp) return false; } =20 + if (!validate_handshake_cookie(i)) { + error_setg(errp, "VMI: received cookie doesn't match"); + return false; + } + /* * Check hsk_in.struct_size and sizeof(hsk_in) before accessing any * other fields. We might get fewer bytes from applications using @@ -468,6 +500,31 @@ static void chr_event(void *opaque, QEMUChrEvent event) } } =20 +static bool make_cookie_hash(const char *key_id, uint8_t *cookie_hash, + Error **errp) +{ + uint8_t *cookie =3D NULL, *hash =3D NULL; + size_t cookie_size, hash_size =3D 0; + bool done =3D false; + + if (qcrypto_secret_lookup(key_id, &cookie, &cookie_size, errp) =3D=3D 0 + && qcrypto_hash_bytes(QCRYPTO_HASH_ALG_SHA1, + (const char *)cookie, cookie_size, + &hash, &hash_size, errp) =3D=3D 0) { + if (hash_size =3D=3D QEMU_VMI_COOKIE_HASH_SIZE) { + memcpy(cookie_hash, hash, QEMU_VMI_COOKIE_HASH_SIZE); + done =3D true; + } else { + error_setg(errp, "VMI: hash algorithm size mismatch"); + } + } + + g_free(cookie); + g_free(hash); + + return done; +} + static Error *vm_introspection_init(VMIntrospection *i) { Error *err =3D NULL; @@ -486,6 +543,15 @@ static Error *vm_introspection_init(VMIntrospection *i) return err; } =20 + if (i->keyid) { + if (!make_cookie_hash(i->keyid, i->cookie_hash, &err)) { + return err; + } + i->key_with_cookie =3D true; + } else { + warn_report("VMI: the introspection tool won't be 'authenticated'"= ); + } + chr =3D qemu_chr_find(i->chardevid); if (!chr) { error_setg(&err, "VMI: device '%s' not found", i->chardevid); From nobody Wed May 15 13:53:04 2024 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=1586912508; cv=none; d=zohomail.com; s=zohoarc; b=ErcPE3SiZDXWekV+owgyV8/UekQlQnW6kp8ZhkFJgqbrQsEYXppZhMK2z4tUsMrwewrB4qXZgr/zR4B+Gyi1KjdvJGsvN/KlqLOX1mNZnzgiPTtYUEV8G6ooMl8R0K6vMlmK9w92H857QybVcoFPF8suNKazAkkgqXPMx9jIPC4= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1586912508; 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=BeDUN4+zZPHLAj7NfeJAMngV+PeErrvW0/qOz8ZkNRY=; b=YrigTgyE7ZvFAZGQNtSZY5Q2XBfy4hLEFltyeFV3sSHPCGrSFfBZaVjyRRPCx1WoHERk/zJfQ8JPOvGMrzkN/PKx7oftyvEC6X0usGmJIDx4gk+G6yQY/AmVMIooecNc2RBzTKfs9wC8JPzONoihn8j7gvLum01y5Blml479Rhc= 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 1586912508562486.08077729017145; Tue, 14 Apr 2020 18:01:48 -0700 (PDT) Received: from localhost ([::1]:40884 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jOWR1-00034i-6N for importer@patchew.org; Tue, 14 Apr 2020 21:01:47 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:58354) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jOWOy-0000vs-IE for qemu-devel@nongnu.org; Tue, 14 Apr 2020 20:59:41 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1jOWOx-00051u-GE for qemu-devel@nongnu.org; Tue, 14 Apr 2020 20:59:40 -0400 Received: from mx01.bbu.dsd.mx.bitdefender.com ([91.199.104.161]:49092) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1jOWOx-000511-7t for qemu-devel@nongnu.org; Tue, 14 Apr 2020 20:59:39 -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 50B2930747CC for ; Wed, 15 Apr 2020 03:59:35 +0300 (EEST) Received: from localhost.localdomain (unknown [91.199.104.27]) by smtp.bitdefender.com (Postfix) with ESMTPSA id 3F091305B7A4; Wed, 15 Apr 2020 03:59:35 +0300 (EEST) From: =?UTF-8?q?Adalbert=20Laz=C4=83r?= To: qemu-devel@nongnu.org Subject: [RFC PATCH v1 13/26] kvm: vmi: block the object destruction if the chardev is connected Date: Wed, 15 Apr 2020 03:59:25 +0300 Message-Id: <20200415005938.23895-14-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?= Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Type: text/plain; charset="utf-8" The introspection tool can modify the VM while it is running (e.g. it can set breakpoints), and when the VM is no longer introspected these changes need to be removed. Until then, we block the destruction of the introspection object that would lead to the unexpected shutdown of the introspection channel. Signed-off-by: Adalbert Laz=C4=83r --- accel/kvm/vmi.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/accel/kvm/vmi.c b/accel/kvm/vmi.c index f456ca56ef..2ce8a60565 100644 --- a/accel/kvm/vmi.c +++ b/accel/kvm/vmi.c @@ -151,11 +151,19 @@ static bool chardev_is_connected(VMIntrospection *i, = Error **errp) return obj && object_property_get_bool(obj, "connected", errp); } =20 +static bool introspection_can_be_deleted(UserCreatable *uc) +{ + VMIntrospection *i =3D VM_INTROSPECTION(uc); + + return !chardev_is_connected(i, NULL); +} + static void class_init(ObjectClass *oc, void *data) { UserCreatableClass *uc =3D USER_CREATABLE_CLASS(oc); =20 uc->complete =3D complete; + uc->can_be_deleted =3D introspection_can_be_deleted; } =20 static void instance_init(Object *obj) From nobody Wed May 15 13:53:04 2024 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=1586912718; cv=none; d=zohomail.com; s=zohoarc; b=GSB1ZopdRnf41X15/iIl+PLMhY0pEy1ioaGyDO9J2wpM+Y5UxEONpcYw0bX94wqFG/fAd0GYwoovU0ZFeFm1eh3uSiKXyM2SEppHRJC7+CAHTcMcrjvIUf6dV0Zq5fWglf0pAn9OD6FtpowexH8XEJN3sLlYORazKvOBqmv0358= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1586912718; 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=hpnc1Nsi5RSqeEh31Xjl4YVFihXKyMgVNxVCNPoACto=; b=BZOdAFI41yXqTpI4vuO1EYJJ+GY0qel2BNJAknrGRNI6yiKX5oykbGphklFlqBKNPUm/MRfbOoLwlG5W8ZL2HlKw9yrkuKcGBx4S+LN8a5ch679Z2a1zSS9QWvs/o4TqXACSxiIHcnjmScvl8nSxjDePWIG4/neWcX7hmd+r5Pg= 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 1586912718971567.605185420644; Tue, 14 Apr 2020 18:05:18 -0700 (PDT) Received: from localhost ([::1]:40916 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jOWUP-0006d7-Ma for importer@patchew.org; Tue, 14 Apr 2020 21:05:17 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:58426) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jOWP8-0001Gx-Nv for qemu-devel@nongnu.org; Tue, 14 Apr 2020 20:59:52 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1jOWP7-0005BN-GO for qemu-devel@nongnu.org; Tue, 14 Apr 2020 20:59:50 -0400 Received: from mx01.bbu.dsd.mx.bitdefender.com ([91.199.104.161]:49094) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1jOWP7-000512-8k for qemu-devel@nongnu.org; Tue, 14 Apr 2020 20:59:49 -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 65CA930747CD for ; Wed, 15 Apr 2020 03:59:35 +0300 (EEST) Received: from localhost.localdomain (unknown [91.199.104.27]) by smtp.bitdefender.com (Postfix) with ESMTPSA id 54760305B7A0; Wed, 15 Apr 2020 03:59:35 +0300 (EEST) From: =?UTF-8?q?Adalbert=20Laz=C4=83r?= To: qemu-devel@nongnu.org Subject: [RFC PATCH v1 14/26] kvm: vmi: allow only one instance of the introspection object Date: Wed, 15 Apr 2020 03:59:26 +0300 Message-Id: <20200415005938.23895-15-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?= Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Type: text/plain; charset="utf-8" Because only one introspection tool must introspect a VM at a given time, we block the completion of the second instance. Signed-off-by: Adalbert Laz=C4=83r --- accel/kvm/vmi.c | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/accel/kvm/vmi.c b/accel/kvm/vmi.c index 2ce8a60565..54c56c6e13 100644 --- a/accel/kvm/vmi.c +++ b/accel/kvm/vmi.c @@ -52,10 +52,18 @@ typedef struct VMIntrospection { bool kvmi_hooked; } VMIntrospection; =20 +typedef struct VMIntrospectionClass { + ObjectClass parent_class; + uint32_t instance_counter; + VMIntrospection *uniq; +} VMIntrospectionClass; + #define TYPE_VM_INTROSPECTION "introspection" =20 #define VM_INTROSPECTION(obj) \ OBJECT_CHECK(VMIntrospection, (obj), TYPE_VM_INTROSPECTION) +#define VM_INTROSPECTION_CLASS(class) \ + OBJECT_CLASS_CHECK(VMIntrospectionClass, (class), TYPE_VM_INTROSPECTIO= N) =20 static Error *vm_introspection_init(VMIntrospection *i); =20 @@ -81,8 +89,14 @@ static void update_vm_start_time(VMIntrospection *i) =20 static void complete(UserCreatable *uc, Error **errp) { + VMIntrospectionClass *ic =3D VM_INTROSPECTION_CLASS(OBJECT(uc)->class); VMIntrospection *i =3D VM_INTROSPECTION(uc); =20 + if (ic->instance_counter > 1) { + error_setg(errp, "VMI: only one introspection object can be create= d"); + return; + } + if (!i->chardevid) { error_setg(errp, "VMI: chardev is not set"); return; @@ -106,6 +120,8 @@ static void complete(UserCreatable *uc, Error **errp) i->init_error =3D NULL; return; } + + ic->uniq =3D i; } =20 static void prop_set_chardev(Object *obj, const char *value, Error **errp) @@ -168,8 +184,11 @@ static void class_init(ObjectClass *oc, void *data) =20 static void instance_init(Object *obj) { + VMIntrospectionClass *ic =3D VM_INTROSPECTION_CLASS(obj->class); VMIntrospection *i =3D VM_INTROSPECTION(obj); =20 + ic->instance_counter++; + i->sock_fd =3D -1; i->created_from_command_line =3D (qdev_hotplug =3D=3D false); =20 @@ -234,6 +253,7 @@ static void cancel_handshake_timer(VMIntrospection *i) =20 static void instance_finalize(Object *obj) { + VMIntrospectionClass *ic =3D VM_INTROSPECTION_CLASS(obj->class); VMIntrospection *i =3D VM_INTROSPECTION(obj); =20 g_free(i->chardevid); @@ -248,12 +268,18 @@ static void instance_finalize(Object *obj) } =20 error_free(i->init_error); + + ic->instance_counter--; + if (!ic->instance_counter) { + ic->uniq =3D NULL; + } } =20 static const TypeInfo info =3D { .name =3D TYPE_VM_INTROSPECTION, .parent =3D TYPE_OBJECT, .class_init =3D class_init, + .class_size =3D sizeof(VMIntrospectionClass), .instance_size =3D sizeof(VMIntrospection), .instance_finalize =3D instance_finalize, .instance_init =3D instance_init, From nobody Wed May 15 13:53:04 2024 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=1586912944; cv=none; d=zohomail.com; s=zohoarc; b=O8A+gtPwOJjmC7NICJYwjbtCvJsauIdYZQ2czwyVfF5/3UboIp1U7MRBP/SeRxvDBcxBdyIzeF+L/Hg6GCwQr/FCbg7efCNFqLJ2f9mwK2irpAeTSWJ3aPiRfkig2fyZ442801fHwRzH0pN/bdyOupTSr8VAblPdsxAlJObE3+k= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1586912944; 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=ayn9OunoUeNtCi6VO8WvbDJcvaNebvxeIGlD/QK0iMA=; b=e+d4Ou7eOegnPeN4NgQ26s3l8aVDf2H2SBRPvZ4MmJbBb2Em7ULOG0w+hbP65eMOWcyKxAa5iU4oDQ6PTQnyahQl1V6kYDqrICrUGi72W5y13/iLSqIVir/PT1yhlxzE9YRxCDOkF/aMtytwN4zH6LbSZYcpqsi9jVYWLddYXZA= 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 158691294447423.851630955942596; Tue, 14 Apr 2020 18:09:04 -0700 (PDT) Received: from localhost ([::1]:40952 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jOWY3-0002DR-3K for importer@patchew.org; Tue, 14 Apr 2020 21:09:03 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:58477) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jOWPA-0001Kf-6f for qemu-devel@nongnu.org; Tue, 14 Apr 2020 20:59:53 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1jOWP8-0005Bu-QT for qemu-devel@nongnu.org; Tue, 14 Apr 2020 20:59:52 -0400 Received: from mx01.bbu.dsd.mx.bitdefender.com ([91.199.104.161]:49096) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1jOWP8-00052I-Hl for qemu-devel@nongnu.org; Tue, 14 Apr 2020 20:59:50 -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 7E08530747CE; Wed, 15 Apr 2020 03:59:35 +0300 (EEST) Received: from localhost.localdomain (unknown [91.199.104.27]) by smtp.bitdefender.com (Postfix) with ESMTPSA id 6A050305B7A5; Wed, 15 Apr 2020 03:59:35 +0300 (EEST) From: =?UTF-8?q?Adalbert=20Laz=C4=83r?= To: qemu-devel@nongnu.org Subject: [RFC PATCH v1 15/26] kvm: vmi: reconnect the socket on reset Date: Wed, 15 Apr 2020 03:59:27 +0300 Message-Id: <20200415005938.23895-16-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 Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Type: text/plain; charset="utf-8" From: Marian Rotariu The guest could be reset from various reasons and by disconnecting the socket (which would reconnect), KVM and the introspection tool will be notified and can clean up the introspection structures. Signed-off-by: Marian Rotariu Signed-off-by: Adalbert Laz=C4=83r --- accel/kvm/vmi.c | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/accel/kvm/vmi.c b/accel/kvm/vmi.c index 54c56c6e13..5beec2b091 100644 --- a/accel/kvm/vmi.c +++ b/accel/kvm/vmi.c @@ -13,6 +13,7 @@ #include "qemu/error-report.h" #include "qom/object_interfaces.h" #include "sysemu/sysemu.h" +#include "sysemu/reset.h" #include "sysemu/kvm.h" #include "crypto/secret.h" #include "crypto/hash.h" @@ -66,6 +67,7 @@ typedef struct VMIntrospectionClass { OBJECT_CLASS_CHECK(VMIntrospectionClass, (class), TYPE_VM_INTROSPECTIO= N) =20 static Error *vm_introspection_init(VMIntrospection *i); +static void vm_introspection_reset(void *opaque); =20 static void machine_ready(Notifier *notifier, void *data) { @@ -122,6 +124,8 @@ static void complete(UserCreatable *uc, Error **errp) } =20 ic->uniq =3D i; + + qemu_register_reset(vm_introspection_reset, i); } =20 static void prop_set_chardev(Object *obj, const char *value, Error **errp) @@ -273,6 +277,8 @@ static void instance_finalize(Object *obj) if (!ic->instance_counter) { ic->uniq =3D NULL; } + + qemu_unregister_reset(vm_introspection_reset, i); } =20 static const TypeInfo info =3D { @@ -534,6 +540,18 @@ static void chr_event(void *opaque, QEMUChrEvent event) } } =20 +static void vm_introspection_reset(void *opaque) +{ + VMIntrospection *i =3D opaque; + + if (i->sock_fd !=3D -1) { + info_report("VMI: Reset detected. Closing the socket..."); + disconnect_and_unhook_kvmi(i); + } + + update_vm_start_time(i); +} + static bool make_cookie_hash(const char *key_id, uint8_t *cookie_hash, Error **errp) { From nobody Wed May 15 13:53:04 2024 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=1586913528; cv=none; d=zohomail.com; s=zohoarc; b=XPXfeW8AuFRktyBljL6aEc0pD7uXPGKfyYokxuZiOjW/V4Ohvv+d/QHJEZfVHfYitYcLupUSRzn4b4N6P8xxzPQIaIeMlZUVVDMGNVm36tMuosmDeeuMIvlP1nCf0yQM6uiRWKqOOgCM7UYbIvOnZhKQ/eGVL/R8nCuhv6u+4Io= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1586913528; 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=UNB1w7vNCQdrU5iUu19XbGO+K5FdheEaFRvb17s9mnQ=; b=KM8oBQZvxFhYsQ8l0efTwUtbjwmQtbYHvXcReTQY8hqYqbRIM9VLDQHeyiJc6l7LekuioqhKYazKwh92MPI7XUl+Kf91Sd11SMNxSfCnzLmY7SGnYIWaTUhF2JEoUOpqyc5exG3aPtExN9H7shl+9w5o3GWMzcp13WiIV2a9J90= 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 1586913528042995.1458033400486; Tue, 14 Apr 2020 18:18:48 -0700 (PDT) Received: from localhost ([::1]:41097 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jOWhS-0000KF-JT for importer@patchew.org; Tue, 14 Apr 2020 21:18:46 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:58505) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jOWPB-0001NF-88 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-0005CN-2n 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]:49098) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1jOWP8-00052H-HW for qemu-devel@nongnu.org; Tue, 14 Apr 2020 20:59:50 -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 A96CA30747D2; Wed, 15 Apr 2020 03:59:35 +0300 (EEST) Received: from localhost.localdomain (unknown [91.199.104.27]) by smtp.bitdefender.com (Postfix) with ESMTPSA id 80EC9305B7A1; Wed, 15 Apr 2020 03:59:35 +0300 (EEST) From: =?UTF-8?q?Adalbert=20Laz=C4=83r?= To: qemu-devel@nongnu.org Subject: [RFC PATCH v1 16/26] kvm: vmi: intercept pause/resume Date: Wed, 15 Apr 2020 03:59:28 +0300 Message-Id: <20200415005938.23895-17-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 Because the introspection tool can run on another VM, suspending either of these two VMs requires signaling the introspection tool to remove any changes made to the introspected VM. This is done through the KVM_INTROSPECTION_PREUNHOOK ioctl. KVM will send an event through the introspection socket, if active. QEMU will wait for the introspection tool to let the VM run without being introspected and close the socket. While the guest is suspended, the socket reconnection is disabled. CC: Markus Armbruster Signed-off-by: Marian Rotariu Signed-off-by: Adalbert Laz=C4=83r --- accel/kvm/vmi.c | 147 +++++++++++++++++++++++++++++++++ accel/stubs/Makefile.objs | 1 + accel/stubs/vmi-stubs.c | 7 ++ include/sysemu/vmi-intercept.h | 21 +++++ monitor/qmp-cmds.c | 10 +++ 5 files changed, 186 insertions(+) create mode 100644 accel/stubs/vmi-stubs.c create mode 100644 include/sysemu/vmi-intercept.h diff --git a/accel/kvm/vmi.c b/accel/kvm/vmi.c index 5beec2b091..151e27265a 100644 --- a/accel/kvm/vmi.c +++ b/accel/kvm/vmi.c @@ -14,12 +14,14 @@ #include "qom/object_interfaces.h" #include "sysemu/sysemu.h" #include "sysemu/reset.h" +#include "sysemu/runstate.h" #include "sysemu/kvm.h" #include "crypto/secret.h" #include "crypto/hash.h" #include "chardev/char.h" #include "chardev/char-fe.h" =20 +#include "sysemu/vmi-intercept.h" #include "sysemu/vmi-handshake.h" =20 #define HANDSHAKE_TIMEOUT_SEC 10 @@ -45,6 +47,10 @@ typedef struct VMIntrospection { GSource *hsk_timer; uint32_t handshake_timeout; =20 + int intercepted_action; + + int reconnect_time; + int64_t vm_start_time; =20 Notifier machine_ready; @@ -59,6 +65,14 @@ typedef struct VMIntrospectionClass { VMIntrospection *uniq; } VMIntrospectionClass; =20 +static const char *action_string[] =3D { + "none", + "suspend", + "resume", +}; + +static bool suspend_pending; + #define TYPE_VM_INTROSPECTION "introspection" =20 #define VM_INTROSPECTION(obj) \ @@ -412,6 +426,39 @@ static bool connect_kernel(VMIntrospection *i, Error *= *errp) return true; } =20 +static void enable_socket_reconnect(VMIntrospection *i) +{ + if (i->sock_fd =3D=3D -1 && i->reconnect_time) { + qemu_chr_fe_reconnect_time(&i->sock, i->reconnect_time); + qemu_chr_fe_disconnect(&i->sock); + i->reconnect_time =3D 0; + } +} + +static void maybe_disable_socket_reconnect(VMIntrospection *i) +{ + 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); + } +} + +static void continue_with_the_intercepted_action(VMIntrospection *i) +{ + switch (i->intercepted_action) { + case VMI_INTERCEPT_SUSPEND: + vm_stop(RUN_STATE_PAUSED); + break; + default: + error_report("VMI: %s: unexpected action %d", + __func__, i->intercepted_action); + break; + } + + info_report("VMI: continue with '%s'", + action_string[i->intercepted_action]); +} + /* * We should read only the handshake structure, * which might have a different size than what we expect. @@ -495,6 +542,14 @@ static void chr_event_open(VMIntrospection *i) { Error *local_err =3D NULL; =20 + if (suspend_pending) { + info_report("VMI: %s: too soon (suspend=3D%d)", + __func__, suspend_pending); + maybe_disable_socket_reconnect(i); + qemu_chr_fe_disconnect(&i->sock); + return; + } + if (!send_handshake_info(i, &local_err)) { error_append_hint(&local_err, "reconnecting\n"); warn_report_err(local_err); @@ -522,6 +577,15 @@ static void chr_event_close(VMIntrospection *i) } =20 cancel_handshake_timer(i); + + if (suspend_pending) { + maybe_disable_socket_reconnect(i); + + if (i->intercepted_action !=3D VMI_INTERCEPT_NONE) { + continue_with_the_intercepted_action(i); + i->intercepted_action =3D VMI_INTERCEPT_NONE; + } + } } =20 static void chr_event(void *opaque, QEMUChrEvent event) @@ -540,6 +604,89 @@ static void chr_event(void *opaque, QEMUChrEvent event) } } =20 +static VMIntrospection *vm_introspection_object(void) +{ + VMIntrospectionClass *ic; + + ic =3D VM_INTROSPECTION_CLASS(object_class_by_name(TYPE_VM_INTROSPECTI= ON)); + + return ic ? ic->uniq : NULL; +} + +/* + * This ioctl succeeds only when KVM signals the introspection tool. + * (the socket is connected and the event was sent without error). + */ +static bool signal_introspection_tool_to_unhook(VMIntrospection *i) +{ + int err; + + err =3D kvm_vm_ioctl(kvm_state, KVM_INTROSPECTION_PREUNHOOK, NULL); + + return !err; +} + +static bool record_intercept_action(VMI_intercept_command action) +{ + switch (action) { + case VMI_INTERCEPT_SUSPEND: + suspend_pending =3D true; + break; + case VMI_INTERCEPT_RESUME: + suspend_pending =3D false; + break; + default: + return false; + } + + return true; +} + +static bool intercept_action(VMIntrospection *i, + VMI_intercept_command action, Error **errp) +{ + if (i->intercepted_action !=3D VMI_INTERCEPT_NONE) { + error_report("VMI: unhook in progress"); + return false; + } + + switch (action) { + case VMI_INTERCEPT_RESUME: + enable_socket_reconnect(i); + return false; + default: + break; + } + + if (!signal_introspection_tool_to_unhook(i)) { + disconnect_and_unhook_kvmi(i); + return false; + } + + i->intercepted_action =3D action; + return true; +} + +bool vm_introspection_intercept(VMI_intercept_command action, Error **errp) +{ + VMIntrospection *i =3D vm_introspection_object(); + bool intercepted =3D false; + + info_report("VMI: intercept command: %s", + action < ARRAY_SIZE(action_string) + ? action_string[action] + : "unknown"); + + if (record_intercept_action(action) && i) { + intercepted =3D intercept_action(i, action, errp); + } + + info_report("VMI: intercept action: %s", + intercepted ? "delayed" : "continue"); + + return intercepted; +} + static void vm_introspection_reset(void *opaque) { VMIntrospection *i =3D opaque; diff --git a/accel/stubs/Makefile.objs b/accel/stubs/Makefile.objs index 3894caf95d..fcec6edf0f 100644 --- a/accel/stubs/Makefile.objs +++ b/accel/stubs/Makefile.objs @@ -2,4 +2,5 @@ obj-$(call lnot,$(CONFIG_HAX)) +=3D hax-stub.o obj-$(call lnot,$(CONFIG_HVF)) +=3D hvf-stub.o obj-$(call lnot,$(CONFIG_WHPX)) +=3D whpx-stub.o obj-$(call lnot,$(CONFIG_KVM)) +=3D kvm-stub.o +obj-$(call lnot,$(CONFIG_KVM)) +=3D vmi-stubs.o obj-$(call lnot,$(CONFIG_TCG)) +=3D tcg-stub.o diff --git a/accel/stubs/vmi-stubs.c b/accel/stubs/vmi-stubs.c new file mode 100644 index 0000000000..1bd93b2ca5 --- /dev/null +++ b/accel/stubs/vmi-stubs.c @@ -0,0 +1,7 @@ +#include "qemu/osdep.h" +#include "sysemu/vmi-intercept.h" + +bool vm_introspection_intercept(VMI_intercept_command ic, Error **errp) +{ + return false; +} diff --git a/include/sysemu/vmi-intercept.h b/include/sysemu/vmi-intercept.h new file mode 100644 index 0000000000..06998ff18a --- /dev/null +++ b/include/sysemu/vmi-intercept.h @@ -0,0 +1,21 @@ +/* + * QEMU VM Introspection + * + * Copyright (C) 2018-2020 Bitdefender S.R.L. + * + * This work is licensed under the terms of the GNU GPL, version 2 or late= r. + * See the COPYING file in the top-level directory. + */ + +#ifndef QEMU_VMI_INTERCEPT_H +#define QEMU_VMI_INTERCEPT_H + +typedef enum { + VMI_INTERCEPT_NONE =3D 0, + VMI_INTERCEPT_SUSPEND, + VMI_INTERCEPT_RESUME, +} VMI_intercept_command; + +bool vm_introspection_intercept(VMI_intercept_command ic, Error **errp); + +#endif /* QEMU_VMI_INTERCEPT_H */ diff --git a/monitor/qmp-cmds.c b/monitor/qmp-cmds.c index 864cbfa32e..eabd20fca3 100644 --- a/monitor/qmp-cmds.c +++ b/monitor/qmp-cmds.c @@ -39,6 +39,8 @@ #include "hw/mem/memory-device.h" #include "hw/acpi/acpi_dev_interface.h" =20 +#include "sysemu/vmi-intercept.h" + NameInfo *qmp_query_name(Error **errp) { NameInfo *info =3D g_malloc0(sizeof(*info)); @@ -87,6 +89,9 @@ void qmp_stop(Error **errp) if (runstate_check(RUN_STATE_INMIGRATE)) { autostart =3D 0; } else { + if (vm_introspection_intercept(VMI_INTERCEPT_SUSPEND, errp)) { + return; + } vm_stop(RUN_STATE_PAUSED); } } @@ -158,6 +163,11 @@ void qmp_cont(Error **errp) autostart =3D 1; } else { vm_start(); + /* + * this interception is post-event as we might need the vm to run = before + * doing the interception, therefore we do not need the return val= ue. + */ + vm_introspection_intercept(VMI_INTERCEPT_RESUME, errp); } } =20 From nobody Wed May 15 13:53:04 2024 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=1586913110; cv=none; d=zohomail.com; s=zohoarc; b=ORP5CWKdpJdjcgRJ4LO/h7C73HU+Cgx8bbjug9Ylshz0fUIubjISrcEMi8y2lyZ+iqH0K97eZ8l4jhdHw0SSgIIJxmxwjIMhKEIQJnga3yhhreGO5IE5MR/EX5B9cx6GeSlRnGv0he8HrKSBbpFnWW2HvK4EP+sr+D/l36MN6FI= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1586913110; 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=JbXjXy7nEKpLnd9eqX6wVXetBneGMaTUcmXce6GKRE8=; b=VyMkotjt/b6nB1FB4Img+PmqR5oubp52tyBoplNHZIpINycK2Lzl4n//RJ10LZoQtFysGltoq0aCNBdGM4vLdkh+ItyyV6fI4Z2/VmfCzr7hzdeXKzfS289uhOuIlCwwjs5mZeyqCOKZ1lMEBtyqM0YRqYB475X49bR+IYEtkEw= 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 1586913110613197.5442501138848; Tue, 14 Apr 2020 18:11:50 -0700 (PDT) Received: from localhost ([::1]:40988 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jOWaj-00063D-9U for importer@patchew.org; Tue, 14 Apr 2020 21:11:49 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:58494) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jOWPA-0001Lk-Ld for qemu-devel@nongnu.org; Tue, 14 Apr 2020 20:59:54 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1jOWP9-0005Ce-5K for qemu-devel@nongnu.org; Tue, 14 Apr 2020 20:59:52 -0400 Received: from mx01.bbu.dsd.mx.bitdefender.com ([91.199.104.161]:49102) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1jOWP8-00052P-J0 for qemu-devel@nongnu.org; Tue, 14 Apr 2020 20:59:50 -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 BCBB630747D3 for ; Wed, 15 Apr 2020 03:59:35 +0300 (EEST) Received: from localhost.localdomain (unknown [91.199.104.27]) by smtp.bitdefender.com (Postfix) with ESMTPSA id AC5CE305B7A0; Wed, 15 Apr 2020 03:59:35 +0300 (EEST) From: =?UTF-8?q?Adalbert=20Laz=C4=83r?= To: qemu-devel@nongnu.org Subject: [RFC PATCH v1 17/26] kvm: vmi: add 'unhook_timeout' property Date: Wed, 15 Apr 2020 03:59:29 +0300 Message-Id: <20200415005938.23895-18-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?= Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Type: text/plain; charset="utf-8" When the introspection tool has to remove all changes made to the introspected VM, the guest must run because some hooks can be removed only in certain conditions. But this shouldn't take too long even with a host under heavy load. So, if the socket is not closed by the introspection tool at the end of this unhook process in the time specified by the unhook_timeout property, QEMU will shutdown the socket. Signed-off-by: Adalbert Laz=C4=83r --- accel/kvm/vmi.c | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/accel/kvm/vmi.c b/accel/kvm/vmi.c index 151e27265a..1f3aff3bfe 100644 --- a/accel/kvm/vmi.c +++ b/accel/kvm/vmi.c @@ -25,6 +25,7 @@ #include "sysemu/vmi-handshake.h" =20 #define HANDSHAKE_TIMEOUT_SEC 10 +#define UNHOOK_TIMEOUT_SEC 60 =20 typedef struct VMIntrospection { Object parent_obj; @@ -48,6 +49,8 @@ typedef struct VMIntrospection { uint32_t handshake_timeout; =20 int intercepted_action; + GSource *unhook_timer; + uint32_t unhook_timeout; =20 int reconnect_time; =20 @@ -219,6 +222,11 @@ static void instance_init(Object *obj) object_property_add(obj, "handshake_timeout", "uint32", prop_set_uint32, prop_get_uint32, NULL, &i->handshake_timeout, NULL); + + i->unhook_timeout =3D UNHOOK_TIMEOUT_SEC; + object_property_add(obj, "unhook_timeout", "uint32", + prop_set_uint32, prop_get_uint32, + NULL, &i->unhook_timeout, NULL); } =20 static void disconnect_chardev(VMIntrospection *i) @@ -269,6 +277,12 @@ static void cancel_handshake_timer(VMIntrospection *i) i->hsk_timer =3D NULL; } =20 +static void cancel_unhook_timer(VMIntrospection *i) +{ + cancel_timer(i->unhook_timer); + i->unhook_timer =3D NULL; +} + static void instance_finalize(Object *obj) { VMIntrospectionClass *ic =3D VM_INTROSPECTION_CLASS(obj->class); @@ -277,6 +291,7 @@ static void instance_finalize(Object *obj) g_free(i->chardevid); g_free(i->keyid); =20 + cancel_unhook_timer(i); cancel_handshake_timer(i); =20 if (i->chr) { @@ -576,6 +591,7 @@ static void chr_event_close(VMIntrospection *i) disconnect_and_unhook_kvmi(i); } =20 + cancel_unhook_timer(i); cancel_handshake_timer(i); =20 if (suspend_pending) { @@ -604,6 +620,19 @@ static void chr_event(void *opaque, QEMUChrEvent event) } } =20 +static gboolean unhook_timeout_cbk(gpointer opaque) +{ + VMIntrospection *i =3D opaque; + + warn_report("VMI: the introspection tool is too slow"); + + g_source_unref(i->unhook_timer); + i->unhook_timer =3D NULL; + + disconnect_and_unhook_kvmi(i); + return FALSE; +} + static VMIntrospection *vm_introspection_object(void) { VMIntrospectionClass *ic; @@ -663,6 +692,10 @@ static bool intercept_action(VMIntrospection *i, return false; } =20 + i->unhook_timer =3D qemu_chr_timeout_add_ms(i->chr, + i->unhook_timeout * 1000, + unhook_timeout_cbk, i); + i->intercepted_action =3D action; return true; } From nobody Wed May 15 13:53:05 2024 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=1586913012; cv=none; d=zohomail.com; s=zohoarc; b=AtTu/SYjFydXRaChUwr6CRyojlVxfLAnWxbALXd3ukVm/VGmwnNB1Xra++nnTBrfn//fDddKJkrd3me6FJZszkq5QqqGOcWs5ETbPUSF4aTSMzjmjtIIM1LNHdyLnXgEh3rmJJ6WrxWMpjovAn9Cv9kKCXV1gwPouN4AwLotA18= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1586913012; 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=T9rIYrQWlEQ6P2Oel4THxdiOudIxbwgyNdMzDf6fUn4=; b=JmITFVev0dHSbWvRtjJj40W0t2Kz9hbtkpjo+nt9ZN2bRzc9VFyC0b1ObcFJ2x1bK/D7WR7Li0i27tvIVCP7nWykIis/o/QaNfgpDfXeedOWCL5fWuhabxZ1M6UR95BVarRiw6Tw96mXwaCf7Q3dQNETvjHsMrjdIomTOdafqjM= 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 1586913012679522.5278750673642; Tue, 14 Apr 2020 18:10:12 -0700 (PDT) Received: from localhost ([::1]:40954 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jOWZ9-0003Ll-DE for importer@patchew.org; Tue, 14 Apr 2020 21:10:11 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:58506) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jOWPB-0001NQ-9B for qemu-devel@nongnu.org; Tue, 14 Apr 2020 20:59:54 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1jOWP8-0005C0-RU 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]:49100) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1jOWP8-00052O-Jd for qemu-devel@nongnu.org; Tue, 14 Apr 2020 20:59:50 -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 D363230747D4 for ; Wed, 15 Apr 2020 03:59:35 +0300 (EEST) Received: from localhost.localdomain (unknown [91.199.104.27]) by smtp.bitdefender.com (Postfix) with ESMTPSA id BF5E1305B7A2; Wed, 15 Apr 2020 03:59:35 +0300 (EEST) From: =?UTF-8?q?Adalbert=20Laz=C4=83r?= To: qemu-devel@nongnu.org Subject: [RFC PATCH v1 18/26] kvm: vmi: store/restore 'vm_start_time' on migrate/snapshot Date: Wed, 15 Apr 2020 03:59:30 +0300 Message-Id: <20200415005938.23895-19-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?= Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Type: text/plain; charset="utf-8" The VM start time sent during handshake can be used by the introspection tool as a session id. We save this 'VM start time' with the snapshot in order to be sent again to the introspection tool when the VM is restored from snapshot and the introspection connection is reestablished. Signed-off-by: Adalbert Laz=C4=83r --- accel/kvm/vmi.c | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/accel/kvm/vmi.c b/accel/kvm/vmi.c index 1f3aff3bfe..e511558f3d 100644 --- a/accel/kvm/vmi.c +++ b/accel/kvm/vmi.c @@ -20,6 +20,7 @@ #include "crypto/hash.h" #include "chardev/char.h" #include "chardev/char-fe.h" +#include "migration/vmstate.h" =20 #include "sysemu/vmi-intercept.h" #include "sysemu/vmi-handshake.h" @@ -203,6 +204,16 @@ static void class_init(ObjectClass *oc, void *data) uc->can_be_deleted =3D introspection_can_be_deleted; } =20 +static const VMStateDescription vmstate_introspection =3D { + .name =3D "vm_introspection", + .minimum_version_id =3D 1, + .version_id =3D 1, + .fields =3D (VMStateField[]) { + VMSTATE_INT64(vm_start_time, VMIntrospection), + VMSTATE_END_OF_LIST() + } +}; + static void instance_init(Object *obj) { VMIntrospectionClass *ic =3D VM_INTROSPECTION_CLASS(obj->class); @@ -227,6 +238,8 @@ static void instance_init(Object *obj) object_property_add(obj, "unhook_timeout", "uint32", prop_set_uint32, prop_get_uint32, NULL, &i->unhook_timeout, NULL); + + vmstate_register(NULL, 0, &vmstate_introspection, i); } =20 static void disconnect_chardev(VMIntrospection *i) From nobody Wed May 15 13:53:05 2024 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=1586913212; cv=none; d=zohomail.com; s=zohoarc; b=eagwqRv2T4LZL+YrvgCK//ixbWTV0kw+nHWrrjE3+WxZxth1yk7peJBO5afUYCpPrqJOtfGNO/cyeaKSk/0Fk1mZW46rZVeOpx5AWJVHJn++lveMLjvndGayIxnHBLYDKKwYsg99dtywFE8eknhsfrtBSnyNIWZCkWJCp2h2fog= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1586913212; 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=P0PCL63As0w3sWEm6pzh6GtCXfSTG1N5XQWKMI4xz1g=; b=Kfd0if7pjC3ZDLI1MANi9iYVV2Go/OPjCmaFoSjum6NwKvuTubgq6zlNGcWo59rcIr/A2yTe5H5DyPZcKV+cwJbloV6RkeQFwIH5Kira1XnRFy05ukQW69dtVJjPvfeRrLlkpDy57y/CfVH5ycLavM6rIUKM9bSbYTaTTQolt54= 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 1586913212285193.8313296598085; Tue, 14 Apr 2020 18:13:32 -0700 (PDT) Received: from localhost ([::1]:41008 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jOWcM-0001CV-Vi for importer@patchew.org; Tue, 14 Apr 2020 21:13:31 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:58484) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jOWPA-0001L6-Cv for qemu-devel@nongnu.org; Tue, 14 Apr 2020 20:59:54 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1jOWP8-0005C6-SX for qemu-devel@nongnu.org; Tue, 14 Apr 2020 20:59:52 -0400 Received: from mx01.bbu.dsd.mx.bitdefender.com ([91.199.104.161]:49104) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1jOWP8-00052R-JG for qemu-devel@nongnu.org; Tue, 14 Apr 2020 20:59:50 -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 EBB1E30747D5; Wed, 15 Apr 2020 03:59:35 +0300 (EEST) Received: from localhost.localdomain (unknown [91.199.104.27]) by smtp.bitdefender.com (Postfix) with ESMTPSA id D6C48305B7A3; Wed, 15 Apr 2020 03:59:35 +0300 (EEST) From: =?UTF-8?q?Adalbert=20Laz=C4=83r?= To: qemu-devel@nongnu.org Subject: [RFC PATCH v1 19/26] kvm: vmi: intercept force-reset Date: Wed, 15 Apr 2020 03:59:31 +0300 Message-Id: <20200415005938.23895-20-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 forced reset, KVM and the instrospection tool must clean-up the introspection structures. An important thing that must by done by KVM is to unlink the shared memory pages (the introspection tool can map memory pages from the introspected VM in its own process/VM). CC: Markus Armbruster Signed-off-by: Marian Rotariu Signed-off-by: Adalbert Laz=C4=83r --- accel/kvm/vmi.c | 6 ++++++ include/sysemu/vmi-intercept.h | 2 ++ monitor/qmp-cmds.c | 4 ++++ 3 files changed, 12 insertions(+) diff --git a/accel/kvm/vmi.c b/accel/kvm/vmi.c index e511558f3d..90906478b4 100644 --- a/accel/kvm/vmi.c +++ b/accel/kvm/vmi.c @@ -73,6 +73,7 @@ static const char *action_string[] =3D { "none", "suspend", "resume", + "force-reset", }; =20 static bool suspend_pending; @@ -677,6 +678,8 @@ static bool record_intercept_action(VMI_intercept_comma= nd action) case VMI_INTERCEPT_RESUME: suspend_pending =3D false; break; + case VMI_INTERCEPT_FORCE_RESET: + break; default: return false; } @@ -693,6 +696,9 @@ static bool intercept_action(VMIntrospection *i, } =20 switch (action) { + case VMI_INTERCEPT_FORCE_RESET: + disconnect_and_unhook_kvmi(i); + return false; case VMI_INTERCEPT_RESUME: enable_socket_reconnect(i); return false; diff --git a/include/sysemu/vmi-intercept.h b/include/sysemu/vmi-intercept.h index 06998ff18a..ef591b49e7 100644 --- a/include/sysemu/vmi-intercept.h +++ b/include/sysemu/vmi-intercept.h @@ -14,8 +14,10 @@ typedef enum { VMI_INTERCEPT_NONE =3D 0, VMI_INTERCEPT_SUSPEND, VMI_INTERCEPT_RESUME, + VMI_INTERCEPT_FORCE_RESET, } VMI_intercept_command; =20 bool vm_introspection_intercept(VMI_intercept_command ic, Error **errp); +bool vm_introspection_qmp_delay(void *mon, QObject *id, bool resume); =20 #endif /* QEMU_VMI_INTERCEPT_H */ diff --git a/monitor/qmp-cmds.c b/monitor/qmp-cmds.c index eabd20fca3..d164635b5f 100644 --- a/monitor/qmp-cmds.c +++ b/monitor/qmp-cmds.c @@ -98,6 +98,10 @@ void qmp_stop(Error **errp) =20 void qmp_system_reset(Error **errp) { + if (vm_introspection_intercept(VMI_INTERCEPT_FORCE_RESET, errp)) { + return; + } + qemu_system_reset_request(SHUTDOWN_CAUSE_HOST_QMP_SYSTEM_RESET); } =20 From nobody Wed May 15 13:53:05 2024 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=1586913218; cv=none; d=zohomail.com; s=zohoarc; b=Xv+/szhhPP3yfqjI4eUvnFn24McNrLQvPqDVvIAaas0/4kV3f+rIBqhn0tiR6hj9KAURuT/svhdnVUkO83zbzNUon9ejgkoSbDRAmgd/OvSBGQfPTpTEUmYrcS82A2ryXIWrJkNOu+YQ/jvxGDUzAFz+9sXRm3IR4HsTnfz/f48= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1586913218; 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=ox9ygO4cQg7u4mBg0UeU1OU/DNF6MXVyPGCT0bXmiaw=; b=dEPVsqh7TtocxkaqEpuFGCOjk/ohK8iRKTPp3dIFFB55scj9uuDhkiP0aidLFpQXZzDXz/fx8nMJEbpqAsRyWfDbguTmbuJVvpvlj+xfULk71tZ7pFkkJbxAFgQlw+RV+RFNHSvwsevGxUh5jg6Yiy1wsTvYBt74h6TIFSGr+tk= 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 1586913218500677.6288952921408; Tue, 14 Apr 2020 18:13:38 -0700 (PDT) Received: from localhost ([::1]:41012 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jOWcT-0001Si-5t for importer@patchew.org; Tue, 14 Apr 2020 21:13:37 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:58559) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jOWPC-0001RE-BP 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-0005Cp-5D for qemu-devel@nongnu.org; Tue, 14 Apr 2020 20:59:54 -0400 Received: from mx01.bbu.dsd.mx.bitdefender.com ([91.199.104.161]:49106) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1jOWP8-00052Q-Ih 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 165A53074838; 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 EE47F305B7A4; Wed, 15 Apr 2020 03:59:35 +0300 (EEST) From: =?UTF-8?q?Adalbert=20Laz=C4=83r?= To: qemu-devel@nongnu.org Subject: [RFC PATCH v1 20/26] kvm: vmi: intercept live migration Date: Wed, 15 Apr 2020 03:59:32 +0300 Message-Id: <20200415005938.23895-21-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 , "Dr. David Alan Gilbert" , Juan Quintela Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Type: text/plain; charset="utf-8" From: Marian Rotariu It is possible that the introspection tool has made some changes inside the introspected VM which can make the guest crash if the introspection connection is suddenly closed. When the live migration starts, for now, the introspection tool is signaled to remove its hooks from the introspected VM. CC: Juan Quintela CC: "Dr. David Alan Gilbert" Signed-off-by: Marian Rotariu Signed-off-by: Adalbert Laz=C4=83r --- accel/kvm/vmi.c | 31 +++++++++++++++++++++++++++---- include/sysemu/vmi-intercept.h | 1 + migration/migration.c | 18 +++++++++++++++--- migration/migration.h | 2 ++ 4 files changed, 45 insertions(+), 7 deletions(-) diff --git a/accel/kvm/vmi.c b/accel/kvm/vmi.c index 90906478b4..ea7191e48d 100644 --- a/accel/kvm/vmi.c +++ b/accel/kvm/vmi.c @@ -21,6 +21,8 @@ #include "chardev/char.h" #include "chardev/char-fe.h" #include "migration/vmstate.h" +#include "migration/migration.h" +#include "migration/misc.h" =20 #include "sysemu/vmi-intercept.h" #include "sysemu/vmi-handshake.h" @@ -58,6 +60,7 @@ typedef struct VMIntrospection { int64_t vm_start_time; =20 Notifier machine_ready; + Notifier migration_state_change; bool created_from_command_line; =20 bool kvmi_hooked; @@ -74,9 +77,11 @@ static const char *action_string[] =3D { "suspend", "resume", "force-reset", + "migrate", }; =20 static bool suspend_pending; +static bool migrate_pending; =20 #define TYPE_VM_INTROSPECTION "introspection" =20 @@ -88,6 +93,15 @@ static bool suspend_pending; static Error *vm_introspection_init(VMIntrospection *i); static void vm_introspection_reset(void *opaque); =20 +static void migration_state_notifier(Notifier *notifier, void *data) +{ + MigrationState *s =3D data; + + if (migration_has_failed(s)) { + migrate_pending =3D false; + } +} + static void machine_ready(Notifier *notifier, void *data) { VMIntrospection *i =3D container_of(notifier, VMIntrospection, machine= _ready); @@ -144,6 +158,9 @@ static void complete(UserCreatable *uc, Error **errp) =20 ic->uniq =3D i; =20 + i->migration_state_change.notify =3D migration_state_notifier; + add_migration_state_change_notifier(&i->migration_state_change); + qemu_register_reset(vm_introspection_reset, i); } =20 @@ -478,6 +495,9 @@ static void continue_with_the_intercepted_action(VMIntr= ospection *i) case VMI_INTERCEPT_SUSPEND: vm_stop(RUN_STATE_PAUSED); break; + case VMI_INTERCEPT_MIGRATE: + start_live_migration_thread(migrate_get_current()); + break; default: error_report("VMI: %s: unexpected action %d", __func__, i->intercepted_action); @@ -571,9 +591,9 @@ static void chr_event_open(VMIntrospection *i) { Error *local_err =3D NULL; =20 - if (suspend_pending) { - info_report("VMI: %s: too soon (suspend=3D%d)", - __func__, suspend_pending); + if (suspend_pending || migrate_pending) { + info_report("VMI: %s: too soon (suspend=3D%d, migrate=3D%d)", + __func__, suspend_pending, migrate_pending); maybe_disable_socket_reconnect(i); qemu_chr_fe_disconnect(&i->sock); return; @@ -608,7 +628,7 @@ static void chr_event_close(VMIntrospection *i) cancel_unhook_timer(i); cancel_handshake_timer(i); =20 - if (suspend_pending) { + if (suspend_pending || migrate_pending) { maybe_disable_socket_reconnect(i); =20 if (i->intercepted_action !=3D VMI_INTERCEPT_NONE) { @@ -680,6 +700,9 @@ static bool record_intercept_action(VMI_intercept_comma= nd action) break; case VMI_INTERCEPT_FORCE_RESET: break; + case VMI_INTERCEPT_MIGRATE: + migrate_pending =3D true; + break; default: return false; } diff --git a/include/sysemu/vmi-intercept.h b/include/sysemu/vmi-intercept.h index ef591b49e7..b4a9a3faa7 100644 --- a/include/sysemu/vmi-intercept.h +++ b/include/sysemu/vmi-intercept.h @@ -15,6 +15,7 @@ typedef enum { VMI_INTERCEPT_SUSPEND, VMI_INTERCEPT_RESUME, VMI_INTERCEPT_FORCE_RESET, + VMI_INTERCEPT_MIGRATE, } VMI_intercept_command; =20 bool vm_introspection_intercept(VMI_intercept_command ic, Error **errp); diff --git a/migration/migration.c b/migration/migration.c index 187ac0410c..222037d739 100644 --- a/migration/migration.c +++ b/migration/migration.c @@ -55,6 +55,8 @@ #include "qemu/queue.h" #include "multifd.h" =20 +#include "sysemu/vmi-intercept.h" + #define MAX_THROTTLE (32 << 20) /* Migration transfer speed throttli= ng */ =20 /* Amount of time to allocate to each "chunk" of bandwidth-throttled @@ -3471,6 +3473,13 @@ static void *migration_thread(void *opaque) return NULL; } =20 +void start_live_migration_thread(MigrationState *s) +{ + qemu_thread_create(&s->thread, "live_migration", migration_thread, s, + QEMU_THREAD_JOINABLE); + s->migration_thread_running =3D true; +} + void migrate_fd_connect(MigrationState *s, Error *error_in) { Error *local_err =3D NULL; @@ -3534,9 +3543,12 @@ void migrate_fd_connect(MigrationState *s, Error *er= ror_in) migrate_fd_cleanup(s); return; } - qemu_thread_create(&s->thread, "live_migration", migration_thread, s, - QEMU_THREAD_JOINABLE); - s->migration_thread_running =3D true; + + if (vm_introspection_intercept(VMI_INTERCEPT_MIGRATE, &error_in)) { + return; + } + + start_live_migration_thread(s); } =20 void migration_global_dump(Monitor *mon) diff --git a/migration/migration.h b/migration/migration.h index 507284e563..eb5668e1f2 100644 --- a/migration/migration.h +++ b/migration/migration.h @@ -263,6 +263,8 @@ struct MigrationState uint8_t clear_bitmap_shift; }; =20 +void start_live_migration_thread(MigrationState *s); + void migrate_set_state(int *state, int old_state, int new_state); =20 void migration_fd_process_incoming(QEMUFile *f, Error **errp); From nobody Wed May 15 13:53:05 2024 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=1586913642; cv=none; d=zohomail.com; s=zohoarc; b=m2nsw2x7D7SlSO12NQP27XBUWRLGxTVinPUxdLbBHoNMU6tsC09K9/JZiQ951W/xB16gHtmLEU5RQHOJehvMUaqie+1v0jNNErIdlabhTIKvX1N50hfKI+0OijWZH/nEcGLwcOaNuxRaDWUCQJcavItg8EgB7EIwByM//3AyVKA= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1586913642; 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=301hfo5CN0Ag+0SwUzN8+DIT2wX5HunfF8YjvWhcNaA=; b=kdoPzNG9wnIkHE+dqyXAlLBkWGyQEN9oXXgFB+3KbXUU/TzKca14P7m+oMp/OCxLu/pS7nD+IwxluQDfGJ+EZ0XRprMR0k1IfFi25u1KVCoh2NTb4kFKtJ23ussGQVFdd85h79fk4DLbYvqc3sqmRvnCxAFrz1e1It7u8XpzTNc= 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 1586913642592929.9681620360029; Tue, 14 Apr 2020 18:20:42 -0700 (PDT) Received: from localhost ([::1]:41128 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jOWjJ-0002YT-AH for importer@patchew.org; Tue, 14 Apr 2020 21:20:41 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:58562) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jOWPC-0001S5-J8 for qemu-devel@nongnu.org; Tue, 14 Apr 2020 20:59:56 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1jOWP9-0005Cu-6k for qemu-devel@nongnu.org; Tue, 14 Apr 2020 20:59:54 -0400 Received: from mx01.bbu.dsd.mx.bitdefender.com ([91.199.104.161]:49108) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1jOWP8-00052c-NL 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 2B6703074839; 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 175AE305B7A0; 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 21/26] kvm: vmi: postpone the OK response from qmp_stop() Date: Wed, 15 Apr 2020 03:59:33 +0300 Message-Id: <20200415005938.23895-22-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?= , Markus Armbruster Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Type: text/plain; charset="utf-8" The method to postpone the intercepted command (pause/suspend/migrate) until the introspection tool has the chance to remove its hooks (e.g. breakpoints) from guest doesn't work on snapshot+memory (at least as it is done by libvirt/virt-manager 1.3.1). The sequence qmp_stop()+save_vm+qmp_cont() doesn't wait for the STOP event. save_vm() is called right after qmp_stop() returns OK. What we do is postpone this OK response until the introspection tools finishes the unhook process. CC: Markus Armbruster Signed-off-by: Adalbert Laz=C4=83r --- accel/kvm/vmi.c | 29 +++++++++++++++++++++++++++++ accel/stubs/vmi-stubs.c | 7 +++++++ include/monitor/monitor.h | 1 + include/sysemu/vmi-intercept.h | 2 +- monitor/Makefile.objs | 2 +- monitor/qmp.c | 11 +++++++++++ monitor/stubs.c | 9 +++++++++ 7 files changed, 59 insertions(+), 2 deletions(-) create mode 100644 monitor/stubs.c diff --git a/accel/kvm/vmi.c b/accel/kvm/vmi.c index ea7191e48d..01034d460e 100644 --- a/accel/kvm/vmi.c +++ b/accel/kvm/vmi.c @@ -10,6 +10,7 @@ #include "qemu/osdep.h" #include "qemu-common.h" #include "qapi/error.h" +#include "qapi/qmp/qdict.h" #include "qemu/error-report.h" #include "qom/object_interfaces.h" #include "sysemu/sysemu.h" @@ -23,6 +24,8 @@ #include "migration/vmstate.h" #include "migration/migration.h" #include "migration/misc.h" +#include "qapi/qmp/qobject.h" +#include "monitor/monitor.h" =20 #include "sysemu/vmi-intercept.h" #include "sysemu/vmi-handshake.h" @@ -63,6 +66,9 @@ typedef struct VMIntrospection { Notifier migration_state_change; bool created_from_command_line; =20 + void *qmp_monitor; + QDict *qmp_rsp; + bool kvmi_hooked; } VMIntrospection; =20 @@ -333,6 +339,8 @@ static void instance_finalize(Object *obj) =20 error_free(i->init_error); =20 + qobject_unref(i->qmp_rsp); + ic->instance_counter--; if (!ic->instance_counter) { ic->uniq =3D NULL; @@ -506,6 +514,12 @@ static void continue_with_the_intercepted_action(VMInt= rospection *i) =20 info_report("VMI: continue with '%s'", action_string[i->intercepted_action]); + + if (i->qmp_rsp) { + monitor_qmp_respond_later(i->qmp_monitor, i->qmp_rsp); + i->qmp_monitor =3D NULL; + i->qmp_rsp =3D NULL; + } } =20 /* @@ -676,6 +690,21 @@ static VMIntrospection *vm_introspection_object(void) return ic ? ic->uniq : NULL; } =20 +bool vm_introspection_qmp_delay(void *mon, QDict *rsp) +{ + VMIntrospection *i =3D vm_introspection_object(); + bool intercepted; + + intercepted =3D i && i->intercepted_action =3D=3D VMI_INTERCEPT_SUSPEN= D; + + if (intercepted) { + i->qmp_monitor =3D mon; + i->qmp_rsp =3D rsp; + } + + return intercepted; +} + /* * This ioctl succeeds only when KVM signals the introspection tool. * (the socket is connected and the event was sent without error). diff --git a/accel/stubs/vmi-stubs.c b/accel/stubs/vmi-stubs.c index 1bd93b2ca5..0cb1d6572b 100644 --- a/accel/stubs/vmi-stubs.c +++ b/accel/stubs/vmi-stubs.c @@ -1,7 +1,14 @@ #include "qemu/osdep.h" +#include "qapi/qmp/qdict.h" + #include "sysemu/vmi-intercept.h" =20 bool vm_introspection_intercept(VMI_intercept_command ic, Error **errp) { return false; } + +bool vm_introspection_qmp_delay(void *mon, QDict *rsp) +{ + return false; +} diff --git a/include/monitor/monitor.h b/include/monitor/monitor.h index 1018d754a6..1b3debc635 100644 --- a/include/monitor/monitor.h +++ b/include/monitor/monitor.h @@ -47,5 +47,6 @@ int monitor_fdset_get_fd(int64_t fdset_id, int flags); int monitor_fdset_dup_fd_add(int64_t fdset_id, int dup_fd); void monitor_fdset_dup_fd_remove(int dup_fd); int64_t monitor_fdset_dup_fd_find(int dup_fd); +void monitor_qmp_respond_later(void *_mon, QDict *rsp); =20 #endif /* MONITOR_H */ diff --git a/include/sysemu/vmi-intercept.h b/include/sysemu/vmi-intercept.h index b4a9a3faa7..4b93d17f2b 100644 --- a/include/sysemu/vmi-intercept.h +++ b/include/sysemu/vmi-intercept.h @@ -19,6 +19,6 @@ typedef enum { } VMI_intercept_command; =20 bool vm_introspection_intercept(VMI_intercept_command ic, Error **errp); -bool vm_introspection_qmp_delay(void *mon, QObject *id, bool resume); +bool vm_introspection_qmp_delay(void *mon, QDict *rsp); =20 #endif /* QEMU_VMI_INTERCEPT_H */ diff --git a/monitor/Makefile.objs b/monitor/Makefile.objs index a8533c9dd7..16652ed162 100644 --- a/monitor/Makefile.objs +++ b/monitor/Makefile.objs @@ -3,4 +3,4 @@ common-obj-y +=3D monitor.o qmp.o hmp.o common-obj-y +=3D qmp-cmds.o qmp-cmds-control.o common-obj-y +=3D hmp-cmds.o =20 -storage-daemon-obj-y +=3D monitor.o qmp.o qmp-cmds-control.o +storage-daemon-obj-y +=3D monitor.o qmp.o qmp-cmds-control.o stubs.o diff --git a/monitor/qmp.c b/monitor/qmp.c index f89e7daf27..fc9ea7eafa 100644 --- a/monitor/qmp.c +++ b/monitor/qmp.c @@ -32,6 +32,7 @@ #include "qapi/qmp/qjson.h" #include "qapi/qmp/qlist.h" #include "qapi/qmp/qstring.h" +#include "sysemu/vmi-intercept.h" #include "trace.h" =20 struct QMPRequest { @@ -158,6 +159,16 @@ static void monitor_qmp_dispatch(MonitorQMP *mon, QObj= ect *req) } } =20 + if (!vm_introspection_qmp_delay(mon, rsp)) { + monitor_qmp_respond(mon, rsp); + qobject_unref(rsp); + } +} + +void monitor_qmp_respond_later(void *_mon, QDict *rsp) +{ + MonitorQMP *mon =3D _mon; + monitor_qmp_respond(mon, rsp); qobject_unref(rsp); } diff --git a/monitor/stubs.c b/monitor/stubs.c new file mode 100644 index 0000000000..fc5707ae13 --- /dev/null +++ b/monitor/stubs.c @@ -0,0 +1,9 @@ +#include "qemu/osdep.h" +#include "qapi/qmp/qdict.h" + +#include "sysemu/vmi-intercept.h" + +bool vm_introspection_qmp_delay(void *mon, QDict *rsp) +{ + return false; +} From nobody Wed May 15 13:53:05 2024 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=1586913313; cv=none; d=zohomail.com; s=zohoarc; b=mUgM4XTJjDZKrBe4iwP6JzK0i2wj6bSxV9bYaZPZfj5eEI1IAgXTjgolRSEY8TFuxEukCaSglqvskTSd6kslBsaNIMso+vtobGdaHKtt6baAwlXFASTdJP6Fggs3o7xVD5p1jwUecjkB20Emwn1thykiV6ES+AJ2dcEsGzg/jwQ= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1586913313; 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=ZgJ3liU7t06H+RNy2xxjSfn3/PGxlKQoS3tuBnXxsdg=; b=O2FCDLMFPDF+tF9kBnJo1i20879kHBP2GRjcQBEJvslEBKlEjxZDkDmrkv5Bgj3D/LS73hz9o2R0krC1TLHOuH/hEGKuOCi920z/Fa5Y70n9zbF4jq5sUwRUtJRk4sITRdZd6yfHg38qyP+jWVlSaqdlI3Q/6+rQ8Rx1SB9RyT8= 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 1586913313459547.8079727296188; Tue, 14 Apr 2020 18:15:13 -0700 (PDT) Received: from localhost ([::1]:41034 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jOWe0-0004dd-58 for importer@patchew.org; Tue, 14 Apr 2020 21:15:12 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:58485) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jOWPA-0001L8-EN for qemu-devel@nongnu.org; Tue, 14 Apr 2020 20:59:54 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1jOWP9-0005CY-3z for qemu-devel@nongnu.org; Tue, 14 Apr 2020 20:59:52 -0400 Received: from mx01.bbu.dsd.mx.bitdefender.com ([91.199.104.161]:49110) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1jOWP8-00052b-Mg 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 3AA83307483A for ; 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 2B115305B7A1; 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 22/26] kvm: vmi: add 'async_unhook' property Date: Wed, 15 Apr 2020 03:59:34 +0300 Message-Id: <20200415005938.23895-23-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?= Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Type: text/plain; charset="utf-8" The default method to handle the intercepted commands (pause/suspend/migrate) might not be the simplest method. We add an alternative method, used when async_unhook is set to false, that runs the main loop until the introspection tool finish the unhook process and closes the introspection socket. Signed-off-by: Adalbert Laz=C4=83r --- accel/kvm/vmi.c | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/accel/kvm/vmi.c b/accel/kvm/vmi.c index 01034d460e..bee9798e54 100644 --- a/accel/kvm/vmi.c +++ b/accel/kvm/vmi.c @@ -57,6 +57,7 @@ typedef struct VMIntrospection { int intercepted_action; GSource *unhook_timer; uint32_t unhook_timeout; + bool async_unhook; =20 int reconnect_time; =20 @@ -186,6 +187,20 @@ static void prop_set_key(Object *obj, const char *valu= e, Error **errp) i->keyid =3D g_strdup(value); } =20 +static bool prop_get_async_unhook(Object *obj, Error **errp) +{ + VMIntrospection *i =3D VM_INTROSPECTION(obj); + + return i->async_unhook; +} + +static void prop_set_async_unhook(Object *obj, bool value, Error **errp) +{ + VMIntrospection *i =3D VM_INTROSPECTION(obj); + + i->async_unhook =3D value; +} + static void prop_get_uint32(Object *obj, Visitor *v, const char *name, void *opaque, Error **errp) { @@ -263,6 +278,11 @@ static void instance_init(Object *obj) prop_set_uint32, prop_get_uint32, NULL, &i->unhook_timeout, NULL); =20 + i->async_unhook =3D true; + object_property_add_bool(obj, "async_unhook", + prop_get_async_unhook, + prop_set_async_unhook, NULL); + vmstate_register(NULL, 0, &vmstate_introspection, i); } =20 @@ -739,6 +759,19 @@ static bool record_intercept_action(VMI_intercept_comm= and action) return true; } =20 +static void wait_until_the_socket_is_closed(VMIntrospection *i) +{ + info_report("VMI: start waiting until fd=3D%d is closed", i->sock_fd); + + while (i->sock_fd !=3D -1) { + main_loop_wait(false); + } + + info_report("VMI: continue with the intercepted action fd=3D%d", i->so= ck_fd); + + maybe_disable_socket_reconnect(i); +} + static bool intercept_action(VMIntrospection *i, VMI_intercept_command action, Error **errp) { @@ -767,6 +800,11 @@ static bool intercept_action(VMIntrospection *i, i->unhook_timeout * 1000, unhook_timeout_cbk, i); =20 + if (!i->async_unhook) { + wait_until_the_socket_is_closed(i); + return false; + } + i->intercepted_action =3D action; return true; } From nobody Wed May 15 13:53:05 2024 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 From nobody Wed May 15 13:53:05 2024 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=1586913417; cv=none; d=zohomail.com; s=zohoarc; b=TEsTjJwGUorbr06Tzo0uQnmOe38eILWukCSDB5d5MLFNsx//BYYwb9fHGV1xVQHoVFv2nsGIm+xB2mlHCAB9mQiVhVBzyPmaImoqnES94vCwr98Tz44FEl8brIT6qJ0aARKZCq2ElMYJM0NhIcUPqYEYB03XnySDX4fnSH1vSvk= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1586913417; 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=E3BknOJzpfTWOuEoTRcBRDsm9ghhDUKOyVxajrx/AZg=; b=Dv9e7cbhDApa3j1NeH5p+1N9JnIfprpA6MBGlXPY/oxWNEdkFN8mS+Xkc/wJDGsv3BKFsbyulkbZyWYDb53B9Vl6yhD5Ob9Ou6tqh6EphP5poBm3pmUMB6ZmwTOydw37Ua9/RgW2hYwzBT+mgGLaJVYefh3jYJPMoKOLVmfAPQM= 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 1586913417907536.308421370159; Tue, 14 Apr 2020 18:16:57 -0700 (PDT) Received: from localhost ([::1]:41080 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jOWfg-00070g-Mi for importer@patchew.org; Tue, 14 Apr 2020 21:16:56 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:58498) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jOWPA-0001MB-Rd for qemu-devel@nongnu.org; Tue, 14 Apr 2020 20:59:54 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1jOWP9-0005Ck-5d for qemu-devel@nongnu.org; Tue, 14 Apr 2020 20:59:52 -0400 Received: from mx01.bbu.dsd.mx.bitdefender.com ([91.199.104.161]:49114) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1jOWP8-00052i-PO 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 664CA3074872 for ; 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 55FEC305B7A3; 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 24/26] kvm: vmi: add 'unhook_on_shutdown' property Date: Wed, 15 Apr 2020 03:59:36 +0300 Message-Id: <20200415005938.23895-25-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?= Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Type: text/plain; charset="utf-8" Some introspection tools can detect when the guest is shutting down. This new option, 'unhook_on_shutdown' controls if QEMU will notify the introspection tool on a shutdown command at its level. Signed-off-by: Adalbert Laz=C4=83r --- accel/kvm/vmi.c | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/accel/kvm/vmi.c b/accel/kvm/vmi.c index 2c6981a4bf..02877eec06 100644 --- a/accel/kvm/vmi.c +++ b/accel/kvm/vmi.c @@ -58,6 +58,7 @@ typedef struct VMIntrospection { GSource *unhook_timer; uint32_t unhook_timeout; bool async_unhook; + bool unhook_on_shutdown; =20 int reconnect_time; =20 @@ -203,6 +204,20 @@ static void prop_set_async_unhook(Object *obj, bool va= lue, Error **errp) i->async_unhook =3D value; } =20 +static bool prop_get_unhook_on_shutdown(Object *obj, Error **errp) +{ + VMIntrospection *i =3D VM_INTROSPECTION(obj); + + return i->unhook_on_shutdown; +} + +static void prop_set_unhook_on_shutdown(Object *obj, bool value, Error **e= rrp) +{ + VMIntrospection *i =3D VM_INTROSPECTION(obj); + + i->unhook_on_shutdown =3D value; +} + static void prop_get_uint32(Object *obj, Visitor *v, const char *name, void *opaque, Error **errp) { @@ -285,6 +300,11 @@ static void instance_init(Object *obj) prop_get_async_unhook, prop_set_async_unhook, NULL); =20 + i->unhook_on_shutdown =3D true; + object_property_add_bool(obj, "unhook_on_shutdown", + prop_get_unhook_on_shutdown, + prop_set_unhook_on_shutdown, NULL); + vmstate_register(NULL, 0, &vmstate_introspection, i); } =20 @@ -801,6 +821,11 @@ static bool intercept_action(VMIntrospection *i, } =20 switch (action) { + case VMI_INTERCEPT_SHUTDOWN: + if (!i->unhook_on_shutdown) { + return false; + } + break; case VMI_INTERCEPT_FORCE_RESET: disconnect_and_unhook_kvmi(i); return false; From nobody Wed May 15 13:53:05 2024 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=1586913146; cv=none; d=zohomail.com; s=zohoarc; b=aBuyTuCsnE5QRvkhq3vztkg4OpGfGezs8tDQS/DnOPkqPvOG3zm4QRJxd06fKYU31nGCzkeLANYcBeTOBw3Ctwg1Uc5vkxlJc1S612rqWrzbWN/k1QDYSpalDxzeauAk7jlNkAUBiDWjuUiz4P03qXuQvZb9joAYCF2h8Sbqnvo= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1586913146; 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=RGqzCSBgZZjGkyhbIK/AUx22WGBR3/MW7ivADe7VHpE=; b=DHEIEfZtwRhdaHSY74OHmz4GX8K/3HbZ1zEcBJTIb+6g7hs1+5rU2P8ZMNmnIL00vUqq7ACWnMYjcU3LEAAmsBCYVUYAcZQ9THEGlIffkwhrxcRSGxBX9IP/4ejeafudx0qE48YnFm03RBYv1AN1fyue7xZN+5gryGg8XBLdbsc= 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 1586913146668387.14072295704966; Tue, 14 Apr 2020 18:12:26 -0700 (PDT) Received: from localhost ([::1]:40990 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jOWbJ-00078e-AZ for importer@patchew.org; Tue, 14 Apr 2020 21:12:25 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:58535) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jOWPB-0001Oc-P3 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-0005D1-A2 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]:49116) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1jOWP8-00052n-QN 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 7960A3074895 for ; 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 67278305B7A4; 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 25/26] kvm: vmi: extend handshake to include the e820 table Date: Wed, 15 Apr 2020 03:59:37 +0300 Message-Id: <20200415005938.23895-26-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?= Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Type: text/plain; charset="utf-8" The introspection tool can use the e820 table to avoid accessing (read/write) or modifying access (rwx) for reserved memory pages. Signed-off-by: Adalbert Laz=C4=83r --- accel/kvm/vmi.c | 68 ++++++++++++++++++++++++++++++---- include/sysemu/vmi-handshake.h | 23 +++++++++++- 2 files changed, 82 insertions(+), 9 deletions(-) diff --git a/accel/kvm/vmi.c b/accel/kvm/vmi.c index 02877eec06..f70d78848a 100644 --- a/accel/kvm/vmi.c +++ b/accel/kvm/vmi.c @@ -26,6 +26,7 @@ #include "migration/misc.h" #include "qapi/qmp/qobject.h" #include "monitor/monitor.h" +#include "hw/i386/e820_memory_layout.h" =20 #include "sysemu/vmi-intercept.h" #include "sysemu/vmi-handshake.h" @@ -412,23 +413,74 @@ static void register_types(void) =20 type_init(register_types); =20 +static uint8_t handshake_cpu_type(void) +{ +#ifdef TARGET_X86_64 + return QEMU_VMI_CPU_TYPE_X86_64; +#elif TARGET_I386 + return QEMU_VMI_CPU_TYPE_I386; +#else + return QEMU_VMI_CPU_TYPE_UNKNOWN; +#endif +} + +static int cmp_address(const void *a, const void *b) +{ + uint64_t addr_a =3D ((qemu_vmi_e820_entry *)a)->address; + uint64_t addr_b =3D ((qemu_vmi_e820_entry *)b)->address; + + return (addr_a > addr_b) - (addr_a < addr_b); +} + +static void fill_e820_info(qemu_vmi_e820_entry *dest, int n) +{ + int idx; + + for (idx =3D 0; idx < n; idx++) + e820_get_entry2(idx, &dest[idx].type, &dest[idx].address, + &dest[idx].length); + + qsort(dest, n, sizeof(*dest), cmp_address); +} + static bool send_handshake_info(VMIntrospection *i, Error **errp) { - qemu_vmi_to_introspector send =3D {}; + qemu_vmi_to_introspector *send; + int max_n_e820, n_e820; const char *vm_name; + size_t send_sz; int r; =20 - send.struct_size =3D sizeof(send); - send.start_time =3D i->vm_start_time; - memcpy(&send.uuid, &qemu_uuid, sizeof(send.uuid)); + max_n_e820 =3D 8 * sizeof(((qemu_vmi_to_introspector *)0)->arch.e820_c= ount); + n_e820 =3D e820_get_num_entries(); + + if (n_e820 < 0 || n_e820 > max_n_e820) { + warn_report("VMI: discard e820 info (size %d, max %d)", + n_e820, max_n_e820); + n_e820 =3D 0; + } + + send_sz =3D sizeof(*send) + n_e820 * sizeof(qemu_vmi_e820_entry); + + send =3D g_malloc0(send_sz); + + send->struct_size =3D send_sz; + send->start_time =3D i->vm_start_time; + send->cpu_type =3D handshake_cpu_type(); + memcpy(&send->uuid, &qemu_uuid, sizeof(send->uuid)); vm_name =3D qemu_get_vm_name(); if (vm_name) { - snprintf(send.name, sizeof(send.name), "%s", vm_name); - send.name[sizeof(send.name) - 1] =3D 0; + snprintf(send->name, sizeof(send->name), "%s", vm_name); + send->name[sizeof(send->name) - 1] =3D 0; + } + send->arch.e820_count =3D n_e820; + if (n_e820) { + fill_e820_info(send->arch.e820_entries, n_e820); } =20 - r =3D qemu_chr_fe_write_all(&i->sock, (uint8_t *)&send, sizeof(send)); - if (r !=3D sizeof(send)) { + r =3D qemu_chr_fe_write_all(&i->sock, (uint8_t *)send, send_sz); + g_free(send); + if (r !=3D send_sz) { error_setg_errno(errp, errno, "VMI: error writing to '%s'", i->chardevid); return false; diff --git a/include/sysemu/vmi-handshake.h b/include/sysemu/vmi-handshake.h index 19bdfb6740..3c5201d37b 100644 --- a/include/sysemu/vmi-handshake.h +++ b/include/sysemu/vmi-handshake.h @@ -9,6 +9,25 @@ enum { QEMU_VMI_NAME_SIZE =3D 64 }; enum { QEMU_VMI_COOKIE_HASH_SIZE =3D 20}; =20 +enum { + QEMU_VMI_CPU_TYPE_I386 =3D 0, + QEMU_VMI_CPU_TYPE_X86_64 =3D 1, + QEMU_VMI_CPU_TYPE_UNKNOWN =3D 255 +}; + +typedef struct qemu_vmi_e820_entry { + uint64_t address; + uint64_t length; + uint32_t type; + uint32_t padding; +} qemu_vmi_e820_entry; + +typedef struct qemu_vmi_to_introspector_x86 { + uint8_t e820_count; + uint8_t padding[3]; + qemu_vmi_e820_entry e820_entries[0]; +} qemu_vmi_to_introspector_x86; + /** * qemu_vmi_to_introspector: * @@ -22,9 +41,11 @@ enum { QEMU_VMI_COOKIE_HASH_SIZE =3D 20}; typedef struct qemu_vmi_to_introspector { uint32_t struct_size; uint8_t uuid[16]; - uint32_t padding; + uint8_t cpu_type; + uint8_t padding[3]; int64_t start_time; char name[QEMU_VMI_NAME_SIZE]; + qemu_vmi_to_introspector_x86 arch; /* ... */ } qemu_vmi_to_introspector; =20 From nobody Wed May 15 13:53:05 2024 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=1586913694; cv=none; d=zohomail.com; s=zohoarc; b=ARJxvPKOkQL+VgUOU5+RsH8xwG0v6W9y/6jsBJuE32KfrxKFpzCScgusSS0u4qoyx23pm8IZHlP7a95UzEohThhnCSJjzHnu9DZKEs9xKBR3jYNVqwLEwQiQX2tO11sCx0KzGUozmMnnepKV8yiKtoBBDCUz5+oyFRJKzLY2axY= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1586913694; 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=91d0T++eno9L0hv84/JlKpZJoAsGJjQJ5/bn+v8xeBo=; b=F1NrbXv9HNbSsQyUubs/fjASm2ty7VVtQKFiClyB9bZDICuNyc8+8mmHo4RCLh62rP1q01NAgsMCz4YP8TF6NGbcQcHLxOUo1jjoTHPAmpxKzHwSv5dfvicsQvd7FVtM1MsVVnXsOvkob3SPnFivaQvO/4+ia87gCTFKUxLLIAo= 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 1586913694394155.04777996004168; Tue, 14 Apr 2020 18:21:34 -0700 (PDT) Received: from localhost ([::1]:41136 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jOWk9-0003s3-7G for importer@patchew.org; Tue, 14 Apr 2020 21:21:33 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:58571) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jOWPD-0001TS-1O for qemu-devel@nongnu.org; Tue, 14 Apr 2020 20:59:56 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1jOWP9-0005DE-Bc for qemu-devel@nongnu.org; Tue, 14 Apr 2020 20:59:54 -0400 Received: from mx01.bbu.dsd.mx.bitdefender.com ([91.199.104.161]:49118) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1jOWP8-00052o-Rg 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 8C91A3074898 for ; 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 7D8F1305B7A0; 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 26/26] kvm: vmi: add 'command' and 'event' properties Date: Wed, 15 Apr 2020 03:59:38 +0300 Message-Id: <20200415005938.23895-27-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?= Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Type: text/plain; charset="utf-8" There are cases when the access to an introspected VM must be limited to certain introspection commands/events. Signed-off-by: Adalbert Laz=C4=83r --- accel/kvm/vmi.c | 86 ++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 74 insertions(+), 12 deletions(-) diff --git a/accel/kvm/vmi.c b/accel/kvm/vmi.c index f70d78848a..1574a643c4 100644 --- a/accel/kvm/vmi.c +++ b/accel/kvm/vmi.c @@ -73,6 +73,9 @@ typedef struct VMIntrospection { QDict *qmp_rsp; =20 bool kvmi_hooked; + + GArray *allowed_commands; + GArray *allowed_events; } VMIntrospection; =20 typedef struct VMIntrospectionClass { @@ -94,6 +97,8 @@ static bool suspend_pending; static bool migrate_pending; static bool shutdown_pending; =20 +static __s32 all_IDs =3D -1; + #define TYPE_VM_INTROSPECTION "introspection" =20 #define VM_INTROSPECTION(obj) \ @@ -239,6 +244,25 @@ static void prop_set_uint32(Object *obj, Visitor *v, c= onst char *name, } } =20 +static void prop_add_to_array(Object *obj, Visitor *v, + const char *name, void *opaque, + Error **errp) +{ + Error *local_err =3D NULL; + GArray *arr =3D opaque; + uint32_t value; + + visit_type_uint32(v, name, &value, &local_err); + if (!local_err && value =3D=3D (uint32_t)all_IDs) { + error_setg(&local_err, "VMI: add %s: invalid id %d", name, value); + } + if (local_err) { + error_propagate(errp, local_err); + } else { + g_array_append_val(arr, value); + } +} + static bool chardev_is_connected(VMIntrospection *i, Error **errp) { Object *obj =3D OBJECT(i->chr); @@ -286,6 +310,15 @@ static void instance_init(Object *obj) object_property_add_str(obj, "chardev", NULL, prop_set_chardev, NULL); object_property_add_str(obj, "key", NULL, prop_set_key, NULL); =20 + i->allowed_commands =3D g_array_new(FALSE, FALSE, sizeof(uint32_t)); + object_property_add(obj, "command", "uint32", + prop_add_to_array, NULL, + NULL, i->allowed_commands, NULL); + i->allowed_events =3D g_array_new(FALSE, FALSE, sizeof(uint32_t)); + object_property_add(obj, "event", "uint32", + prop_add_to_array, NULL, + NULL, i->allowed_events, NULL); + i->handshake_timeout =3D HANDSHAKE_TIMEOUT_SEC; object_property_add(obj, "handshake_timeout", "uint32", prop_set_uint32, prop_get_uint32, @@ -368,6 +401,13 @@ static void instance_finalize(Object *obj) VMIntrospectionClass *ic =3D VM_INTROSPECTION_CLASS(obj->class); VMIntrospection *i =3D VM_INTROSPECTION(obj); =20 + if (i->allowed_commands) { + g_array_free(i->allowed_commands, TRUE); + } + if (i->allowed_events) { + g_array_free(i->allowed_events, TRUE); + } + g_free(i->chardevid); g_free(i->keyid); =20 @@ -531,11 +571,39 @@ static bool validate_handshake(VMIntrospection *i, Er= ror **errp) return true; } =20 +static bool set_allowed_features(int ioctl, GArray *allowed, Error **errp) +{ + struct kvm_introspection_feature feature; + gint i; + + feature.allow =3D 1; + + if (allowed->len =3D=3D 0) { + feature.id =3D all_IDs; + if (kvm_vm_ioctl(kvm_state, ioctl, &feature)) { + goto out_err; + } + } else { + for (i =3D 0; i < allowed->len; i++) { + feature.id =3D g_array_index(allowed, uint32_t, i); + if (kvm_vm_ioctl(kvm_state, ioctl, &feature)) { + goto out_err; + } + } + } + + return true; + +out_err: + error_setg_errno(errp, -errno, + "VMI: feature %d with id %d failed", + ioctl, feature.id); + return false; +} + static bool connect_kernel(VMIntrospection *i, Error **errp) { - struct kvm_introspection_feature commands, events; struct kvm_introspection_hook kernel; - const __s32 all_ids =3D -1; =20 memset(&kernel, 0, sizeof(kernel)); memcpy(kernel.uuid, &qemu_uuid, sizeof(kernel.uuid)); @@ -553,20 +621,14 @@ static bool connect_kernel(VMIntrospection *i, Error = **errp) =20 i->kvmi_hooked =3D true; =20 - commands.allow =3D 1; - commands.id =3D all_ids; - if (kvm_vm_ioctl(kvm_state, KVM_INTROSPECTION_COMMAND, &commands)) { - error_setg_errno(errp, -errno, - "VMI: ioctl/KVM_INTROSPECTION_COMMAND failed"); + if (!set_allowed_features(KVM_INTROSPECTION_COMMAND, + i->allowed_commands, errp)) { unhook_kvmi(i); return false; } =20 - events.allow =3D 1; - events.id =3D all_ids; - if (kvm_vm_ioctl(kvm_state, KVM_INTROSPECTION_EVENT, &events)) { - error_setg_errno(errp, -errno, - "VMI: ioctl/KVM_INTROSPECTION_EVENT failed"); + if (!set_allowed_features(KVM_INTROSPECTION_EVENT, + i->allowed_events, errp)) { unhook_kvmi(i); return false; }