From nobody Fri May 3 10:49:03 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 150220948390831.923177230348415; Tue, 8 Aug 2017 09:24:43 -0700 (PDT) Received: from localhost ([::1]:43549 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1df7JC-0007y8-Fv for importer@patchew.org; Tue, 08 Aug 2017 12:24:42 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:57780) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1df7Hr-0007JI-5w for qemu-devel@nongnu.org; Tue, 08 Aug 2017 12:23:20 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1df7Hn-0005jh-4I for qemu-devel@nongnu.org; Tue, 08 Aug 2017 12:23:19 -0400 Received: from mx1.redhat.com ([209.132.183.28]:54754) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1df7Hm-0005jO-RV for qemu-devel@nongnu.org; Tue, 08 Aug 2017 12:23:15 -0400 Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.phx2.redhat.com [10.5.11.14]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id C77027881A for ; Tue, 8 Aug 2017 16:23:13 +0000 (UTC) Received: from secure.mitica (ovpn-117-165.ams2.redhat.com [10.36.117.165]) by smtp.corp.redhat.com (Postfix) with ESMTP id 918AD5F91E; Tue, 8 Aug 2017 16:22:44 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com C77027881A Authentication-Results: ext-mx03.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx03.extmail.prod.ext.phx2.redhat.com; spf=fail smtp.mailfrom=quintela@redhat.com From: Juan Quintela To: qemu-devel@nongnu.org Date: Tue, 8 Aug 2017 18:22:06 +0200 Message-Id: <20170808162224.32419-2-quintela@redhat.com> In-Reply-To: <20170808162224.32419-1-quintela@redhat.com> References: <20170808162224.32419-1-quintela@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.14 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.27]); Tue, 08 Aug 2017 16:23:13 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH v6 01/19] migration: Create migration_ioc_process_incoming() X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: lvivier@redhat.com, dgilbert@redhat.com, peterx@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" We pass the ioc instead of the fd. This will allow us to have more than one channel open. We also make sure that we set the from_src_file sooner, so we don't need to pass it as a parameter. Signed-off-by: Juan Quintela --- migration/channel.c | 3 +-- migration/migration.c | 25 ++++++++++++++++++++----- migration/migration.h | 2 ++ 3 files changed, 23 insertions(+), 7 deletions(-) diff --git a/migration/channel.c b/migration/channel.c index 3b7252f..edceebd 100644 --- a/migration/channel.c +++ b/migration/channel.c @@ -36,8 +36,7 @@ void migration_channel_process_incoming(QIOChannel *ioc) error_report_err(local_err); } } else { - QEMUFile *f =3D qemu_fopen_channel_input(ioc); - migration_fd_process_incoming(f); + migration_ioc_process_incoming(ioc); } } =20 diff --git a/migration/migration.c b/migration/migration.c index c3fe0ed..86e41e8 100644 --- a/migration/migration.c +++ b/migration/migration.c @@ -307,17 +307,16 @@ static void process_incoming_migration_bh(void *opaqu= e) =20 static void process_incoming_migration_co(void *opaque) { - QEMUFile *f =3D opaque; MigrationIncomingState *mis =3D migration_incoming_get_current(); PostcopyState ps; int ret; =20 - mis->from_src_file =3D f; + assert(mis->from_src_file); mis->largest_page_size =3D qemu_ram_pagesize_largest(); postcopy_state_set(POSTCOPY_INCOMING_NONE); migrate_set_state(&mis->state, MIGRATION_STATUS_NONE, MIGRATION_STATUS_ACTIVE); - ret =3D qemu_loadvm_state(f); + ret =3D qemu_loadvm_state(mis->from_src_file); =20 ps =3D postcopy_state_get(); trace_process_incoming_migration_co_end(ret, ps); @@ -365,12 +364,28 @@ static void process_incoming_migration_co(void *opaqu= e) =20 void migration_fd_process_incoming(QEMUFile *f) { - Coroutine *co =3D qemu_coroutine_create(process_incoming_migration_co,= f); - + Coroutine *co =3D qemu_coroutine_create(process_incoming_migration_co,= NULL); + MigrationIncomingState *mis =3D migration_incoming_get_current(); + =20 + if (!mis->from_src_file) { + mis->from_src_file =3D f; + } qemu_file_set_blocking(f, false); qemu_coroutine_enter(co); } =20 +void migration_ioc_process_incoming(QIOChannel *ioc) +{ + MigrationIncomingState *mis =3D migration_incoming_get_current(); + + if (!mis->from_src_file) { + QEMUFile *f =3D qemu_fopen_channel_input(ioc); + mis->from_src_file =3D f; + migration_fd_process_incoming(f); + } + /* We still only have a single channel. Nothing to do here yet */ +} + /* * Send a 'SHUT' message on the return channel with the given value * to indicate that we've finished with the RP. Non-0 value indicates diff --git a/migration/migration.h b/migration/migration.h index 148c9fa..99c398d 100644 --- a/migration/migration.h +++ b/migration/migration.h @@ -20,6 +20,7 @@ #include "exec/cpu-common.h" #include "qemu/coroutine_int.h" #include "hw/qdev.h" +#include "io/channel.h" =20 /* State for the incoming migration */ struct MigrationIncomingState { @@ -152,6 +153,7 @@ struct MigrationState void migrate_set_state(int *state, int old_state, int new_state); =20 void migration_fd_process_incoming(QEMUFile *f); +void migration_ioc_process_incoming(QIOChannel *ioc); =20 uint64_t migrate_max_downtime(void); =20 --=20 2.9.4 From nobody Fri May 3 10:49:03 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1502209559376455.72620976161693; Tue, 8 Aug 2017 09:25:59 -0700 (PDT) Received: from localhost ([::1]:43560 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1df7KQ-0000Zq-4x for importer@patchew.org; Tue, 08 Aug 2017 12:25:58 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:58310) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1df7In-0007tO-PK for qemu-devel@nongnu.org; Tue, 08 Aug 2017 12:24:19 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1df7Ij-0006EA-OJ for qemu-devel@nongnu.org; Tue, 08 Aug 2017 12:24:17 -0400 Received: from mx1.redhat.com ([209.132.183.28]:40582) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1df7Ij-0006De-Hf for qemu-devel@nongnu.org; Tue, 08 Aug 2017 12:24:13 -0400 Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.phx2.redhat.com [10.5.11.14]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 80518806C6 for ; Tue, 8 Aug 2017 16:24:12 +0000 (UTC) Received: from secure.mitica (ovpn-117-165.ams2.redhat.com [10.36.117.165]) by smtp.corp.redhat.com (Postfix) with ESMTP id 24B0A18B94; Tue, 8 Aug 2017 16:23:13 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 80518806C6 Authentication-Results: ext-mx02.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx02.extmail.prod.ext.phx2.redhat.com; spf=fail smtp.mailfrom=quintela@redhat.com From: Juan Quintela To: qemu-devel@nongnu.org Date: Tue, 8 Aug 2017 18:22:07 +0200 Message-Id: <20170808162224.32419-3-quintela@redhat.com> In-Reply-To: <20170808162224.32419-1-quintela@redhat.com> References: <20170808162224.32419-1-quintela@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.14 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.26]); Tue, 08 Aug 2017 16:24:12 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH v6 02/19] migration: Teach it about G_SOURCE_REMOVE X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: lvivier@redhat.com, dgilbert@redhat.com, peterx@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" As this is defined on glib 2.32, add compatibility macros for older glibs. Signed-off-by: Juan Quintela --- include/glib-compat.h | 2 ++ migration/exec.c | 2 +- migration/fd.c | 2 +- migration/socket.c | 2 +- 4 files changed, 5 insertions(+), 3 deletions(-) diff --git a/include/glib-compat.h b/include/glib-compat.h index fcffcd3..e15aca2 100644 --- a/include/glib-compat.h +++ b/include/glib-compat.h @@ -223,6 +223,8 @@ static inline gboolean g_hash_table_contains(GHashTable= *hash_table, { return g_hash_table_lookup_extended(hash_table, key, NULL, NULL); } +#define G_SOURCE_CONTINUE TRUE +#define G_SOURCE_REMOVE FALSE #endif =20 #ifndef g_assert_true diff --git a/migration/exec.c b/migration/exec.c index 08b599e..f3be1ba 100644 --- a/migration/exec.c +++ b/migration/exec.c @@ -49,7 +49,7 @@ static gboolean exec_accept_incoming_migration(QIOChannel= *ioc, { migration_channel_process_incoming(ioc); object_unref(OBJECT(ioc)); - return FALSE; /* unregister */ + return G_SOURCE_REMOVE; } =20 void exec_start_incoming_migration(const char *command, Error **errp) diff --git a/migration/fd.c b/migration/fd.c index 30f5258..30de4b9 100644 --- a/migration/fd.c +++ b/migration/fd.c @@ -49,7 +49,7 @@ static gboolean fd_accept_incoming_migration(QIOChannel *= ioc, { migration_channel_process_incoming(ioc); object_unref(OBJECT(ioc)); - return FALSE; /* unregister */ + return G_SOURCE_REMOVE; } =20 void fd_start_incoming_migration(const char *infd, Error **errp) diff --git a/migration/socket.c b/migration/socket.c index 757d382..b02d37d 100644 --- a/migration/socket.c +++ b/migration/socket.c @@ -154,7 +154,7 @@ static gboolean socket_accept_incoming_migration(QIOCha= nnel *ioc, out: /* Close listening socket as its no longer needed */ qio_channel_close(ioc, NULL); - return FALSE; /* unregister */ + return G_SOURCE_REMOVE; } =20 =20 --=20 2.9.4 From nobody Fri May 3 10:49:03 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1502209718211903.891239577048; Tue, 8 Aug 2017 09:28:38 -0700 (PDT) Received: from localhost ([::1]:43569 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1df7My-0002tg-Rw for importer@patchew.org; Tue, 08 Aug 2017 12:28:36 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:58357) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1df7Is-0007xb-U9 for qemu-devel@nongnu.org; Tue, 08 Aug 2017 12:24:27 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1df7Ir-0006If-TO for qemu-devel@nongnu.org; Tue, 08 Aug 2017 12:24:22 -0400 Received: from mx1.redhat.com ([209.132.183.28]:55956) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1df7Ir-0006II-Nl for qemu-devel@nongnu.org; Tue, 08 Aug 2017 12:24:21 -0400 Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.phx2.redhat.com [10.5.11.14]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id B9157C047B7A for ; Tue, 8 Aug 2017 16:24:20 +0000 (UTC) Received: from secure.mitica (ovpn-117-165.ams2.redhat.com [10.36.117.165]) by smtp.corp.redhat.com (Postfix) with ESMTP id CB8C55DD6B; Tue, 8 Aug 2017 16:24:12 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com B9157C047B7A Authentication-Results: ext-mx07.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx07.extmail.prod.ext.phx2.redhat.com; spf=fail smtp.mailfrom=quintela@redhat.com From: Juan Quintela To: qemu-devel@nongnu.org Date: Tue, 8 Aug 2017 18:22:08 +0200 Message-Id: <20170808162224.32419-4-quintela@redhat.com> In-Reply-To: <20170808162224.32419-1-quintela@redhat.com> References: <20170808162224.32419-1-quintela@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.14 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.31]); Tue, 08 Aug 2017 16:24:20 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH v6 03/19] migration: Add comments to channel functions X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: lvivier@redhat.com, dgilbert@redhat.com, peterx@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Signed-off-by: Juan Quintela --- migration/channel.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/migration/channel.c b/migration/channel.c index edceebd..79b0f8b 100644 --- a/migration/channel.c +++ b/migration/channel.c @@ -19,6 +19,14 @@ #include "qapi/error.h" #include "io/channel-tls.h" =20 +/** + * @migration_channel_process_incoming - Create new incoming migration cha= nnel + * + * Notice that TLS is special. For it we listen in a listener socket, + * and then create a new client socket from the TLS library. + * + * @ioc: Channel to wich we are connecting + */ void migration_channel_process_incoming(QIOChannel *ioc) { MigrationState *s =3D migrate_get_current(); @@ -41,6 +49,13 @@ void migration_channel_process_incoming(QIOChannel *ioc) } =20 =20 +/** + * @migration_channel_connect - Create new outgoing migration channel + * + * @s: Current migration state + * @ioc: Channel to wich we are connecting + * @hostname: Where we want to connect + */ void migration_channel_connect(MigrationState *s, QIOChannel *ioc, const char *hostname) --=20 2.9.4 From nobody Fri May 3 10:49:03 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1502209871703203.30147222120615; Tue, 8 Aug 2017 09:31:11 -0700 (PDT) Received: from localhost ([::1]:43584 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1df7PS-0005Kd-5O for importer@patchew.org; Tue, 08 Aug 2017 12:31:10 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:58439) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1df7J0-00082t-4U for qemu-devel@nongnu.org; Tue, 08 Aug 2017 12:24:31 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1df7Iz-0006Ns-19 for qemu-devel@nongnu.org; Tue, 08 Aug 2017 12:24:30 -0400 Received: from mx1.redhat.com ([209.132.183.28]:53444) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1df7Iy-0006Mz-RN for qemu-devel@nongnu.org; Tue, 08 Aug 2017 12:24:28 -0400 Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.phx2.redhat.com [10.5.11.14]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id D19236573E for ; Tue, 8 Aug 2017 16:24:27 +0000 (UTC) Received: from secure.mitica (ovpn-117-165.ams2.redhat.com [10.36.117.165]) by smtp.corp.redhat.com (Postfix) with ESMTP id 7661A5E27D; Tue, 8 Aug 2017 16:24:20 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com D19236573E Authentication-Results: ext-mx09.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx09.extmail.prod.ext.phx2.redhat.com; spf=fail smtp.mailfrom=quintela@redhat.com From: Juan Quintela To: qemu-devel@nongnu.org Date: Tue, 8 Aug 2017 18:22:09 +0200 Message-Id: <20170808162224.32419-5-quintela@redhat.com> In-Reply-To: <20170808162224.32419-1-quintela@redhat.com> References: <20170808162224.32419-1-quintela@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.14 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.38]); Tue, 08 Aug 2017 16:24:28 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH v6 04/19] migration: Create migration_has_all_channels X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: lvivier@redhat.com, dgilbert@redhat.com, peterx@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" This functions allows us to decide when to close the listener socket. For now, we only need one connection. Signed-off-by: Juan Quintela --- migration/migration.c | 11 +++++++++++ migration/migration.h | 2 ++ migration/socket.c | 10 +++++++--- 3 files changed, 20 insertions(+), 3 deletions(-) diff --git a/migration/migration.c b/migration/migration.c index 86e41e8..2c42834 100644 --- a/migration/migration.c +++ b/migration/migration.c @@ -386,6 +386,17 @@ void migration_ioc_process_incoming(QIOChannel *ioc) /* We still only have a single channel. Nothing to do here yet */ } =20 +/** + * @migration_has_all_channels: We have received all channels that we need + * + * Returns true when we have got connections to all the channels that + * we need for migration. + */ +bool migration_has_all_channels(void) +{ + return true; +} + /* * Send a 'SHUT' message on the return channel with the given value * to indicate that we've finished with the RP. Non-0 value indicates diff --git a/migration/migration.h b/migration/migration.h index 99c398d..1881e4a 100644 --- a/migration/migration.h +++ b/migration/migration.h @@ -155,6 +155,8 @@ void migrate_set_state(int *state, int old_state, int n= ew_state); void migration_fd_process_incoming(QEMUFile *f); void migration_ioc_process_incoming(QIOChannel *ioc); =20 +bool migration_has_all_channels(void); + uint64_t migrate_max_downtime(void); =20 void migrate_fd_error(MigrationState *s, const Error *error); diff --git a/migration/socket.c b/migration/socket.c index b02d37d..dee8690 100644 --- a/migration/socket.c +++ b/migration/socket.c @@ -152,9 +152,13 @@ static gboolean socket_accept_incoming_migration(QIOCh= annel *ioc, object_unref(OBJECT(sioc)); =20 out: - /* Close listening socket as its no longer needed */ - qio_channel_close(ioc, NULL); - return G_SOURCE_REMOVE; + if (migration_has_all_channels()) { + /* Close listening socket as its no longer needed */ + qio_channel_close(ioc, NULL); + return G_SOURCE_REMOVE; + } else { + return G_SOURCE_CONTINUE; + } } =20 =20 --=20 2.9.4 From nobody Fri May 3 10:49:03 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1502209593782243.17441915803147; Tue, 8 Aug 2017 09:26:33 -0700 (PDT) Received: from localhost ([::1]:43561 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1df7Ky-00015E-AH for importer@patchew.org; Tue, 08 Aug 2017 12:26:32 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:58505) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1df7JB-0008EV-FK for qemu-devel@nongnu.org; Tue, 08 Aug 2017 12:24:43 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1df7J7-0006Rh-CK for qemu-devel@nongnu.org; Tue, 08 Aug 2017 12:24:41 -0400 Received: from mx1.redhat.com ([209.132.183.28]:42334) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1df7J7-0006R6-39 for qemu-devel@nongnu.org; Tue, 08 Aug 2017 12:24:37 -0400 Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.phx2.redhat.com [10.5.11.14]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 1C9DD806B6 for ; Tue, 8 Aug 2017 16:24:36 +0000 (UTC) Received: from secure.mitica (ovpn-117-165.ams2.redhat.com [10.36.117.165]) by smtp.corp.redhat.com (Postfix) with ESMTP id 2584118A70; Tue, 8 Aug 2017 16:24:27 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 1C9DD806B6 Authentication-Results: ext-mx02.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx02.extmail.prod.ext.phx2.redhat.com; spf=fail smtp.mailfrom=quintela@redhat.com From: Juan Quintela To: qemu-devel@nongnu.org Date: Tue, 8 Aug 2017 18:22:10 +0200 Message-Id: <20170808162224.32419-6-quintela@redhat.com> In-Reply-To: <20170808162224.32419-1-quintela@redhat.com> References: <20170808162224.32419-1-quintela@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.14 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.26]); Tue, 08 Aug 2017 16:24:36 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH v6 05/19] qio: Create new qio_channel_{readv, writev}_all X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: lvivier@redhat.com, dgilbert@redhat.com, peterx@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" The functions waits until it is able to write the full iov. Signed-off-by: Juan Quintela -- Add tests. fix reader to check for len =3D=3D 0. --- include/io/channel.h | 46 +++++++++++++++++++++++++ io/channel.c | 77 ++++++++++++++++++++++++++++++++++++++= ++++ migration/qemu-file-channel.c | 29 +--------------- tests/io-channel-helpers.c | 55 ++++++++++++++++++++++++++++++ tests/io-channel-helpers.h | 4 +++ tests/test-io-channel-buffer.c | 55 ++++++++++++++++++++++++++++-- 6 files changed, 235 insertions(+), 31 deletions(-) diff --git a/include/io/channel.h b/include/io/channel.h index db9bb02..bfc97e2 100644 --- a/include/io/channel.h +++ b/include/io/channel.h @@ -269,6 +269,52 @@ ssize_t qio_channel_writev_full(QIOChannel *ioc, Error **errp); =20 /** + * qio_channel_readv_all: + * @ioc: the channel object + * @iov: the array of memory regions to read data into + * @niov: the length of the @iov array + * @errp: pointer to a NULL-initialized error object + * + * Read data from the IO channel, storing it in the + * memory regions referenced by @iov. Each element + * in the @iov will be fully populated with data + * before the next one is used. The @niov parameter + * specifies the total number of elements in @iov. + * + * Returns: the number of bytes read, or -1 on error, + * or QIO_CHANNEL_ERR_BLOCK if no data is available + * and the channel is non-blocking + */ +ssize_t qio_channel_readv_all(QIOChannel *ioc, + const struct iovec *iov, + size_t niov, + Error **errp); + + +/** + * qio_channel_writev_all: + * @ioc: the channel object + * @iov: the array of memory regions to write data from + * @niov: the length of the @iov array + * @errp: pointer to a NULL-initialized error object + * + * Write data to the IO channel, reading it from the + * memory regions referenced by @iov. Each element + * in the @iov will be fully sent, before the next + * one is used. The @niov parameter specifies the + * total number of elements in @iov. + * + * It is required for all @iov data to be fully + * sent. + * + * Returns: the number of bytes sent, or -1 on error, + */ +ssize_t qio_channel_writev_all(QIOChannel *ioc, + const struct iovec *iov, + size_t niov, + Error **erp); + +/** * qio_channel_readv: * @ioc: the channel object * @iov: the array of memory regions to read data into diff --git a/io/channel.c b/io/channel.c index 1cfb8b3..0b521f9 100644 --- a/io/channel.c +++ b/io/channel.c @@ -22,6 +22,7 @@ #include "io/channel.h" #include "qapi/error.h" #include "qemu/main-loop.h" +#include "qemu/iov.h" =20 bool qio_channel_has_feature(QIOChannel *ioc, QIOChannelFeature feature) @@ -85,6 +86,82 @@ ssize_t qio_channel_writev_full(QIOChannel *ioc, } =20 =20 + +ssize_t qio_channel_readv_all(QIOChannel *ioc, + const struct iovec *iov, + size_t niov, + Error **errp) +{ + ssize_t done =3D 0; + struct iovec *local_iov =3D g_new(struct iovec, niov); + struct iovec *local_iov_head =3D local_iov; + unsigned int nlocal_iov =3D niov; + + nlocal_iov =3D iov_copy(local_iov, nlocal_iov, + iov, niov, + 0, iov_size(iov, niov)); + + while (nlocal_iov > 0) { + ssize_t len; + len =3D qio_channel_readv(ioc, local_iov, nlocal_iov, errp); + if (len =3D=3D QIO_CHANNEL_ERR_BLOCK) { + qio_channel_wait(ioc, G_IO_OUT); + continue; + } else if (len < 0) { + error_setg_errno(errp, EIO, + "Channel was not able to read full iov"); + done =3D -1; + goto cleanup; + } else if (len =3D=3D 0) { + goto cleanup; + } + + iov_discard_front(&local_iov, &nlocal_iov, len); + done +=3D len; + } + + cleanup: + g_free(local_iov_head); + return done; +} + +ssize_t qio_channel_writev_all(QIOChannel *ioc, + const struct iovec *iov, + size_t niov, + Error **errp) +{ + ssize_t done =3D 0; + struct iovec *local_iov =3D g_new(struct iovec, niov); + struct iovec *local_iov_head =3D local_iov; + unsigned int nlocal_iov =3D niov; + + nlocal_iov =3D iov_copy(local_iov, nlocal_iov, + iov, niov, + 0, iov_size(iov, niov)); + + while (nlocal_iov > 0) { + ssize_t len; + len =3D qio_channel_writev(ioc, local_iov, nlocal_iov, errp); + if (len =3D=3D QIO_CHANNEL_ERR_BLOCK) { + qio_channel_wait(ioc, G_IO_OUT); + continue; + } + if (len < 0) { + error_setg_errno(errp, EIO, + "Channel was not able to write full iov"); + done =3D -1; + goto cleanup; + } + + iov_discard_front(&local_iov, &nlocal_iov, len); + done +=3D len; + } + + cleanup: + g_free(local_iov_head); + return done; +} + ssize_t qio_channel_readv(QIOChannel *ioc, const struct iovec *iov, size_t niov, diff --git a/migration/qemu-file-channel.c b/migration/qemu-file-channel.c index e202d73..457ea6c 100644 --- a/migration/qemu-file-channel.c +++ b/migration/qemu-file-channel.c @@ -36,35 +36,8 @@ static ssize_t channel_writev_buffer(void *opaque, int64_t pos) { QIOChannel *ioc =3D QIO_CHANNEL(opaque); - ssize_t done =3D 0; - struct iovec *local_iov =3D g_new(struct iovec, iovcnt); - struct iovec *local_iov_head =3D local_iov; - unsigned int nlocal_iov =3D iovcnt; =20 - nlocal_iov =3D iov_copy(local_iov, nlocal_iov, - iov, iovcnt, - 0, iov_size(iov, iovcnt)); - - while (nlocal_iov > 0) { - ssize_t len; - len =3D qio_channel_writev(ioc, local_iov, nlocal_iov, NULL); - if (len =3D=3D QIO_CHANNEL_ERR_BLOCK) { - qio_channel_wait(ioc, G_IO_OUT); - continue; - } - if (len < 0) { - /* XXX handle Error objects */ - done =3D -EIO; - goto cleanup; - } - - iov_discard_front(&local_iov, &nlocal_iov, len); - done +=3D len; - } - - cleanup: - g_free(local_iov_head); - return done; + return qio_channel_writev_all(ioc, iov, iovcnt, NULL); } =20 =20 diff --git a/tests/io-channel-helpers.c b/tests/io-channel-helpers.c index 05e5579..3d76d95 100644 --- a/tests/io-channel-helpers.c +++ b/tests/io-channel-helpers.c @@ -21,6 +21,7 @@ #include "qemu/osdep.h" #include "io-channel-helpers.h" #include "qapi/error.h" +#include "qemu/iov.h" =20 struct QIOChannelTest { QIOChannel *src; @@ -153,6 +154,45 @@ static gpointer test_io_thread_reader(gpointer opaque) return NULL; } =20 +static gpointer test_io_thread_writer_all(gpointer opaque) +{ + QIOChannelTest *data =3D opaque; + size_t niov =3D data->niov; + ssize_t ret; + + qio_channel_set_blocking(data->src, data->blocking, NULL); + + ret =3D qio_channel_writev_all(data->src, + data->inputv, + niov, + &data->writeerr); + if (ret !=3D iov_size(data->inputv, data->niov)) { + error_setg(&data->writeerr, "Unexpected I/O error"); + } + + return NULL; +} + +/* This thread receives all data using iovecs */ +static gpointer test_io_thread_reader_all(gpointer opaque) +{ + QIOChannelTest *data =3D opaque; + size_t niov =3D data->niov; + ssize_t ret; + + qio_channel_set_blocking(data->dst, data->blocking, NULL); + + ret =3D qio_channel_readv_all(data->dst, + data->outputv, + niov, + &data->readerr); + + if (ret !=3D iov_size(data->inputv, data->niov)) { + error_setg(&data->readerr, "Unexpected I/O error"); + } + + return NULL; +} =20 QIOChannelTest *qio_channel_test_new(void) { @@ -231,6 +271,21 @@ void qio_channel_test_run_reader(QIOChannelTest *test, test->dst =3D NULL; } =20 +void qio_channel_test_run_writer_all(QIOChannelTest *test, + QIOChannel *src) +{ + test->src =3D src; + test_io_thread_writer_all(test); + test->src =3D NULL; +} + +void qio_channel_test_run_reader_all(QIOChannelTest *test, + QIOChannel *dst) +{ + test->dst =3D dst; + test_io_thread_reader_all(test); + test->dst =3D NULL; +} =20 void qio_channel_test_validate(QIOChannelTest *test) { diff --git a/tests/io-channel-helpers.h b/tests/io-channel-helpers.h index fedc64f..17b9647 100644 --- a/tests/io-channel-helpers.h +++ b/tests/io-channel-helpers.h @@ -36,6 +36,10 @@ void qio_channel_test_run_writer(QIOChannelTest *test, QIOChannel *src); void qio_channel_test_run_reader(QIOChannelTest *test, QIOChannel *dst); +void qio_channel_test_run_writer_all(QIOChannelTest *test, + QIOChannel *src); +void qio_channel_test_run_reader_all(QIOChannelTest *test, + QIOChannel *dst); =20 void qio_channel_test_validate(QIOChannelTest *test); =20 diff --git a/tests/test-io-channel-buffer.c b/tests/test-io-channel-buffer.c index 64722a2..4bf64ae 100644 --- a/tests/test-io-channel-buffer.c +++ b/tests/test-io-channel-buffer.c @@ -22,8 +22,7 @@ #include "io/channel-buffer.h" #include "io-channel-helpers.h" =20 - -static void test_io_channel_buf(void) +static void test_io_channel_buf1(void) { QIOChannelBuffer *buf; QIOChannelTest *test; @@ -39,6 +38,53 @@ static void test_io_channel_buf(void) object_unref(OBJECT(buf)); } =20 +static void test_io_channel_buf2(void) +{ + QIOChannelBuffer *buf; + QIOChannelTest *test; + + buf =3D qio_channel_buffer_new(0); + + test =3D qio_channel_test_new(); + qio_channel_test_run_writer_all(test, QIO_CHANNEL(buf)); + buf->offset =3D 0; + qio_channel_test_run_reader(test, QIO_CHANNEL(buf)); + qio_channel_test_validate(test); + + object_unref(OBJECT(buf)); +} + +static void test_io_channel_buf3(void) +{ + QIOChannelBuffer *buf; + QIOChannelTest *test; + + buf =3D qio_channel_buffer_new(0); + + test =3D qio_channel_test_new(); + qio_channel_test_run_writer(test, QIO_CHANNEL(buf)); + buf->offset =3D 0; + qio_channel_test_run_reader_all(test, QIO_CHANNEL(buf)); + qio_channel_test_validate(test); + + object_unref(OBJECT(buf)); +} + +static void test_io_channel_buf4(void) +{ + QIOChannelBuffer *buf; + QIOChannelTest *test; + + buf =3D qio_channel_buffer_new(0); + + test =3D qio_channel_test_new(); + qio_channel_test_run_writer_all(test, QIO_CHANNEL(buf)); + buf->offset =3D 0; + qio_channel_test_run_reader_all(test, QIO_CHANNEL(buf)); + qio_channel_test_validate(test); + + object_unref(OBJECT(buf)); +} =20 int main(int argc, char **argv) { @@ -46,6 +92,9 @@ int main(int argc, char **argv) =20 g_test_init(&argc, &argv, NULL); =20 - g_test_add_func("/io/channel/buf", test_io_channel_buf); + g_test_add_func("/io/channel/buf1", test_io_channel_buf1); + g_test_add_func("/io/channel/buf2", test_io_channel_buf2); + g_test_add_func("/io/channel/buf3", test_io_channel_buf3); + g_test_add_func("/io/channel/buf4", test_io_channel_buf4); return g_test_run(); } --=20 2.9.4 From nobody Fri May 3 10:49:03 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1502210034407980.2095043012879; Tue, 8 Aug 2017 09:33:54 -0700 (PDT) Received: from localhost ([::1]:43591 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1df7S5-0007Yz-2O for importer@patchew.org; Tue, 08 Aug 2017 12:33:53 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:58545) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1df7JF-0008HH-Pv for qemu-devel@nongnu.org; Tue, 08 Aug 2017 12:24:47 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1df7JE-0006Vj-Mm for qemu-devel@nongnu.org; Tue, 08 Aug 2017 12:24:45 -0400 Received: from mx1.redhat.com ([209.132.183.28]:50458) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1df7JE-0006Uz-H8 for qemu-devel@nongnu.org; Tue, 08 Aug 2017 12:24:44 -0400 Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.phx2.redhat.com [10.5.11.14]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 7B8637F40C for ; Tue, 8 Aug 2017 16:24:43 +0000 (UTC) Received: from secure.mitica (ovpn-117-165.ams2.redhat.com [10.36.117.165]) by smtp.corp.redhat.com (Postfix) with ESMTP id 6BBA018A70; Tue, 8 Aug 2017 16:24:36 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 7B8637F40C Authentication-Results: ext-mx01.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx01.extmail.prod.ext.phx2.redhat.com; spf=fail smtp.mailfrom=quintela@redhat.com From: Juan Quintela To: qemu-devel@nongnu.org Date: Tue, 8 Aug 2017 18:22:11 +0200 Message-Id: <20170808162224.32419-7-quintela@redhat.com> In-Reply-To: <20170808162224.32419-1-quintela@redhat.com> References: <20170808162224.32419-1-quintela@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.14 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.25]); Tue, 08 Aug 2017 16:24:43 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH v6 06/19] migration: Add multifd capability X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: lvivier@redhat.com, dgilbert@redhat.com, peterx@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Signed-off-by: Juan Quintela Reviewed-by: Dr. David Alan Gilbert -- Use new DEFINE_PROP --- migration/migration.c | 10 ++++++++++ migration/migration.h | 1 + qapi-schema.json | 3 ++- 3 files changed, 13 insertions(+), 1 deletion(-) diff --git a/migration/migration.c b/migration/migration.c index 2c42834..4e6ad87 100644 --- a/migration/migration.c +++ b/migration/migration.c @@ -1450,6 +1450,15 @@ bool migrate_use_events(void) return s->enabled_capabilities[MIGRATION_CAPABILITY_EVENTS]; } =20 +bool migrate_use_multifd(void) +{ + MigrationState *s; + + s =3D migrate_get_current(); + + return s->enabled_capabilities[MIGRATION_CAPABILITY_X_MULTIFD]; +} + int migrate_use_xbzrle(void) { MigrationState *s; @@ -2228,6 +2237,7 @@ static Property migration_properties[] =3D { DEFINE_PROP_MIG_CAP("x-release-ram", MIGRATION_CAPABILITY_RELEASE_RAM), DEFINE_PROP_MIG_CAP("x-block", MIGRATION_CAPABILITY_BLOCK), DEFINE_PROP_MIG_CAP("x-return-path", MIGRATION_CAPABILITY_RETURN_PATH), + DEFINE_PROP_MIG_CAP("x-multifd", MIGRATION_CAPABILITY_X_MULTIFD), =20 DEFINE_PROP_END_OF_LIST(), }; diff --git a/migration/migration.h b/migration/migration.h index 1881e4a..b7437f1 100644 --- a/migration/migration.h +++ b/migration/migration.h @@ -174,6 +174,7 @@ bool migrate_postcopy_ram(void); bool migrate_zero_blocks(void); =20 bool migrate_auto_converge(void); +bool migrate_use_multifd(void); =20 int migrate_use_xbzrle(void); int64_t migrate_xbzrle_cache_size(void); diff --git a/qapi-schema.json b/qapi-schema.json index 802ea53..521e15c 100644 --- a/qapi-schema.json +++ b/qapi-schema.json @@ -918,13 +918,14 @@ # # @return-path: If enabled, migration will use the return path even # for precopy. (since 2.10) +# @x-multifd: Use more than one fd for migration (since 2.11) # # Since: 1.2 ## { 'enum': 'MigrationCapability', 'data': ['xbzrle', 'rdma-pin-all', 'auto-converge', 'zero-blocks', 'compress', 'events', 'postcopy-ram', 'x-colo', 'release-ram', - 'block', 'return-path' ] } + 'block', 'return-path', 'x-multifd'] } =20 ## # @MigrationCapabilityStatus: --=20 2.9.4 From nobody Fri May 3 10:49:03 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 15022096391941016.4576814548642; Tue, 8 Aug 2017 09:27:19 -0700 (PDT) Received: from localhost ([::1]:43564 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1df7Lh-0001m0-Ry for importer@patchew.org; Tue, 08 Aug 2017 12:27:17 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:58607) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1df7JQ-0008Rf-Tg for qemu-devel@nongnu.org; Tue, 08 Aug 2017 12:24:58 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1df7JM-0006Zx-Qg for qemu-devel@nongnu.org; Tue, 08 Aug 2017 12:24:56 -0400 Received: from mx1.redhat.com ([209.132.183.28]:35752) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1df7JM-0006ZT-He for qemu-devel@nongnu.org; Tue, 08 Aug 2017 12:24:52 -0400 Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.phx2.redhat.com [10.5.11.14]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 919907881A for ; Tue, 8 Aug 2017 16:24:51 +0000 (UTC) Received: from secure.mitica (ovpn-117-165.ams2.redhat.com [10.36.117.165]) by smtp.corp.redhat.com (Postfix) with ESMTP id 680176C536; Tue, 8 Aug 2017 16:24:42 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 919907881A Authentication-Results: ext-mx03.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx03.extmail.prod.ext.phx2.redhat.com; spf=fail smtp.mailfrom=quintela@redhat.com From: Juan Quintela To: qemu-devel@nongnu.org Date: Tue, 8 Aug 2017 18:22:12 +0200 Message-Id: <20170808162224.32419-8-quintela@redhat.com> In-Reply-To: <20170808162224.32419-1-quintela@redhat.com> References: <20170808162224.32419-1-quintela@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.14 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.27]); Tue, 08 Aug 2017 16:24:51 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH v6 07/19] migration: Create x-multifd-threads parameter X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: lvivier@redhat.com, dgilbert@redhat.com, peterx@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Indicates the number of threads that we would create. By default we create 2 threads. Signed-off-by: Juan Quintela Reviewed-by: Dr. David Alan Gilbert -- Catch inconsistent defaults (eric). Improve comment stating that number of threads is the same than number of sockets Use new DEFIN_PROP_* --- hmp.c | 7 +++++++ migration/migration.c | 26 ++++++++++++++++++++++++++ migration/migration.h | 1 + qapi-schema.json | 25 ++++++++++++++++++++++--- 4 files changed, 56 insertions(+), 3 deletions(-) diff --git a/hmp.c b/hmp.c index fd80dce..7899813 100644 --- a/hmp.c +++ b/hmp.c @@ -337,6 +337,9 @@ void hmp_info_migrate_parameters(Monitor *mon, const QD= ict *qdict) monitor_printf(mon, "%s: %s\n", MigrationParameter_lookup[MIGRATION_PARAMETER_BLOCK_INCREMENTA= L], params->block_incremental ? "on" : "off"); + monitor_printf(mon, "%s: %" PRId64 "\n", + MigrationParameter_lookup[MIGRATION_PARAMETER_X_MULTIFD_THREAD= S], + params->x_multifd_threads); } =20 qapi_free_MigrationParameters(params); @@ -1622,6 +1625,10 @@ void hmp_migrate_set_parameter(Monitor *mon, const Q= Dict *qdict) p->has_block_incremental =3D true; visit_type_bool(v, param, &p->block_incremental, &err); break; + case MIGRATION_PARAMETER_X_MULTIFD_THREADS: + p->has_x_multifd_threads =3D true; + visit_type_int(v, param, &p->x_multifd_threads, &err); + break; } =20 if (err) { diff --git a/migration/migration.c b/migration/migration.c index 4e6ad87..6ed9600 100644 --- a/migration/migration.c +++ b/migration/migration.c @@ -78,6 +78,7 @@ * Note: Please change this default value to 10000 when we support hybrid = mode. */ #define DEFAULT_MIGRATE_X_CHECKPOINT_DELAY 200 +#define DEFAULT_MIGRATE_MULTIFD_THREADS 2 =20 static NotifierList migration_state_notifiers =3D NOTIFIER_LIST_INITIALIZER(migration_state_notifiers); @@ -483,6 +484,8 @@ MigrationParameters *qmp_query_migrate_parameters(Error= **errp) params->x_checkpoint_delay =3D s->parameters.x_checkpoint_delay; params->has_block_incremental =3D true; params->block_incremental =3D s->parameters.block_incremental; + params->has_x_multifd_threads =3D true; + params->x_multifd_threads =3D s->parameters.x_multifd_threads; =20 return params; } @@ -764,6 +767,13 @@ static bool migrate_params_check(MigrationParameters *= params, Error **errp) "is invalid, it should be positive"); return false; } + if (params->has_x_multifd_threads && + (params->x_multifd_threads < 1 || params->x_multifd_threads > 255)= ) { + error_setg(errp, QERR_INVALID_PARAMETER_VALUE, + "multifd_threads", + "is invalid, it should be in the range of 1 to 255"); + return false; + } =20 return true; } @@ -882,6 +892,9 @@ static void migrate_params_apply(MigrateSetParameters *= params) if (params->has_block_incremental) { s->parameters.block_incremental =3D params->block_incremental; } + if (params->has_x_multifd_threads) { + s->parameters.x_multifd_threads =3D params->x_multifd_threads; + } } =20 void qmp_migrate_set_parameters(MigrateSetParameters *params, Error **errp) @@ -1459,6 +1472,15 @@ bool migrate_use_multifd(void) return s->enabled_capabilities[MIGRATION_CAPABILITY_X_MULTIFD]; } =20 +int migrate_multifd_threads(void) +{ + MigrationState *s; + + s =3D migrate_get_current(); + + return s->parameters.x_multifd_threads; +} + int migrate_use_xbzrle(void) { MigrationState *s; @@ -2224,6 +2246,9 @@ static Property migration_properties[] =3D { DEFINE_PROP_INT64("x-checkpoint-delay", MigrationState, parameters.x_checkpoint_delay, DEFAULT_MIGRATE_X_CHECKPOINT_DELAY), + DEFINE_PROP_INT64("x-multifd-threads", MigrationState, + parameters.x_multifd_threads, + DEFAULT_MIGRATE_MULTIFD_THREADS), =20 /* Migration capabilities */ DEFINE_PROP_MIG_CAP("x-xbzrle", MIGRATION_CAPABILITY_XBZRLE), @@ -2281,6 +2306,7 @@ static void migration_instance_init(Object *obj) params->has_downtime_limit =3D true; params->has_x_checkpoint_delay =3D true; params->has_block_incremental =3D true; + params->has_x_multifd_threads =3D true; } =20 /* diff --git a/migration/migration.h b/migration/migration.h index b7437f1..8e4803d 100644 --- a/migration/migration.h +++ b/migration/migration.h @@ -175,6 +175,7 @@ bool migrate_zero_blocks(void); =20 bool migrate_auto_converge(void); bool migrate_use_multifd(void); +int migrate_multifd_threads(void); =20 int migrate_use_xbzrle(void); int64_t migrate_xbzrle_cache_size(void); diff --git a/qapi-schema.json b/qapi-schema.json index 521e15c..3fe1a64 100644 --- a/qapi-schema.json +++ b/qapi-schema.json @@ -918,6 +918,7 @@ # # @return-path: If enabled, migration will use the return path even # for precopy. (since 2.10) +# # @x-multifd: Use more than one fd for migration (since 2.11) # # Since: 1.2 @@ -1043,13 +1044,19 @@ # migrated and the destination must already have access to the # same backing chain as was used on the source. (since 2.10) # +# @x-multifd-threads: Number of threads used to migrate data in +# parallel. This is the same number that the +# number of sockets used for migration. +# The default value is 2 (since 2.11) +# # Since: 2.4 ## { 'enum': 'MigrationParameter', 'data': ['compress-level', 'compress-threads', 'decompress-threads', 'cpu-throttle-initial', 'cpu-throttle-increment', 'tls-creds', 'tls-hostname', 'max-bandwidth', - 'downtime-limit', 'x-checkpoint-delay', 'block-incremental' ] } + 'downtime-limit', 'x-checkpoint-delay', 'block-incremental', + 'x-multifd-threads'] } =20 ## # @MigrateSetParameters: @@ -1105,6 +1112,11 @@ # migrated and the destination must already have access to the # same backing chain as was used on the source. (since 2.10) # +# @x-multifd-threads: Number of threads used to migrate data in +# parallel. This is the same number that the +# number of sockets used for migration. +# The default value is 2 (since 2.11) +# # Since: 2.4 ## # TODO either fuse back into MigrationParameters, or make @@ -1120,7 +1132,8 @@ '*max-bandwidth': 'int', '*downtime-limit': 'int', '*x-checkpoint-delay': 'int', - '*block-incremental': 'bool' } } + '*block-incremental': 'bool', + '*x-multifd-threads': 'int' } } =20 ## # @migrate-set-parameters: @@ -1191,6 +1204,11 @@ # migrated and the destination must already have access to the # same backing chain as was used on the source. (since 2.10) # +# @x-multifd-threads: Number of threads used to migrate data in +# parallel. This is the same number that the +# number of sockets used for migration. +# The default value is 2 (since 2.11) +# # Since: 2.4 ## { 'struct': 'MigrationParameters', @@ -1204,7 +1222,8 @@ '*max-bandwidth': 'int', '*downtime-limit': 'int', '*x-checkpoint-delay': 'int', - '*block-incremental': 'bool' } } + '*block-incremental': 'bool', + '*x-multifd-threads': 'int'} } =20 ## # @query-migrate-parameters: --=20 2.9.4 From nobody Fri May 3 10:49:03 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1502209614338468.14260224509917; Tue, 8 Aug 2017 09:26:54 -0700 (PDT) Received: from localhost ([::1]:43562 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1df7LI-0001NW-Ug for importer@patchew.org; Tue, 08 Aug 2017 12:26:52 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:58630) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1df7JU-0008Ux-Ef for qemu-devel@nongnu.org; Tue, 08 Aug 2017 12:25:01 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1df7JT-0006cD-1I for qemu-devel@nongnu.org; Tue, 08 Aug 2017 12:25:00 -0400 Received: from mx1.redhat.com ([209.132.183.28]:27234) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1df7JS-0006bw-Nb for qemu-devel@nongnu.org; Tue, 08 Aug 2017 12:24:58 -0400 Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.phx2.redhat.com [10.5.11.14]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id B20B04A71F for ; Tue, 8 Aug 2017 16:24:57 +0000 (UTC) Received: from secure.mitica (ovpn-117-165.ams2.redhat.com [10.36.117.165]) by smtp.corp.redhat.com (Postfix) with ESMTP id DEC0C6C523; Tue, 8 Aug 2017 16:24:51 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com B20B04A71F Authentication-Results: ext-mx09.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx09.extmail.prod.ext.phx2.redhat.com; spf=fail smtp.mailfrom=quintela@redhat.com From: Juan Quintela To: qemu-devel@nongnu.org Date: Tue, 8 Aug 2017 18:22:13 +0200 Message-Id: <20170808162224.32419-9-quintela@redhat.com> In-Reply-To: <20170808162224.32419-1-quintela@redhat.com> References: <20170808162224.32419-1-quintela@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.14 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.38]); Tue, 08 Aug 2017 16:24:57 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH v6 08/19] migration: Create x-multifd-group parameter X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: lvivier@redhat.com, dgilbert@redhat.com, peterx@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Indicates how many pages we are going to send in each batch to a multifd thread. Signed-off-by: Juan Quintela Reviewed-by: Dr. David Alan Gilbert -- Be consistent with defaults and documentation Use new DEFINE_PROP_* --- hmp.c | 7 +++++++ migration/migration.c | 26 ++++++++++++++++++++++++++ migration/migration.h | 1 + qapi-schema.json | 17 ++++++++++++++--- 4 files changed, 48 insertions(+), 3 deletions(-) diff --git a/hmp.c b/hmp.c index 7899813..a52035a 100644 --- a/hmp.c +++ b/hmp.c @@ -340,6 +340,9 @@ void hmp_info_migrate_parameters(Monitor *mon, const QD= ict *qdict) monitor_printf(mon, "%s: %" PRId64 "\n", MigrationParameter_lookup[MIGRATION_PARAMETER_X_MULTIFD_THREAD= S], params->x_multifd_threads); + monitor_printf(mon, "%s: %" PRId64 "\n", + MigrationParameter_lookup[MIGRATION_PARAMETER_X_MULTIFD_GROUP], + params->x_multifd_group); } =20 qapi_free_MigrationParameters(params); @@ -1629,6 +1632,10 @@ void hmp_migrate_set_parameter(Monitor *mon, const Q= Dict *qdict) p->has_x_multifd_threads =3D true; visit_type_int(v, param, &p->x_multifd_threads, &err); break; + case MIGRATION_PARAMETER_X_MULTIFD_GROUP: + p->has_x_multifd_group =3D true; + visit_type_int(v, param, &p->x_multifd_group, &err); + break; } =20 if (err) { diff --git a/migration/migration.c b/migration/migration.c index 6ed9600..6c4eb4b 100644 --- a/migration/migration.c +++ b/migration/migration.c @@ -79,6 +79,7 @@ */ #define DEFAULT_MIGRATE_X_CHECKPOINT_DELAY 200 #define DEFAULT_MIGRATE_MULTIFD_THREADS 2 +#define DEFAULT_MIGRATE_MULTIFD_GROUP 16 =20 static NotifierList migration_state_notifiers =3D NOTIFIER_LIST_INITIALIZER(migration_state_notifiers); @@ -486,6 +487,8 @@ MigrationParameters *qmp_query_migrate_parameters(Error= **errp) params->block_incremental =3D s->parameters.block_incremental; params->has_x_multifd_threads =3D true; params->x_multifd_threads =3D s->parameters.x_multifd_threads; + params->has_x_multifd_group =3D true; + params->x_multifd_group =3D s->parameters.x_multifd_group; =20 return params; } @@ -774,6 +777,13 @@ static bool migrate_params_check(MigrationParameters *= params, Error **errp) "is invalid, it should be in the range of 1 to 255"); return false; } + if (params->has_x_multifd_group && + (params->x_multifd_group < 1 || params->x_multifd_group > 1000= 0)) { + error_setg(errp, QERR_INVALID_PARAMETER_VALUE, + "multifd_group", + "is invalid, it should be in the range of 1 to 10000"); + return false; + } =20 return true; } @@ -895,6 +905,9 @@ static void migrate_params_apply(MigrateSetParameters *= params) if (params->has_x_multifd_threads) { s->parameters.x_multifd_threads =3D params->x_multifd_threads; } + if (params->has_x_multifd_group) { + s->parameters.x_multifd_group =3D params->x_multifd_group; + } } =20 void qmp_migrate_set_parameters(MigrateSetParameters *params, Error **errp) @@ -1481,6 +1494,15 @@ int migrate_multifd_threads(void) return s->parameters.x_multifd_threads; } =20 +int migrate_multifd_group(void) +{ + MigrationState *s; + + s =3D migrate_get_current(); + + return s->parameters.x_multifd_group; +} + int migrate_use_xbzrle(void) { MigrationState *s; @@ -2249,6 +2271,9 @@ static Property migration_properties[] =3D { DEFINE_PROP_INT64("x-multifd-threads", MigrationState, parameters.x_multifd_threads, DEFAULT_MIGRATE_MULTIFD_THREADS), + DEFINE_PROP_INT64("x-multifd-group", MigrationState, + parameters.x_multifd_group, + DEFAULT_MIGRATE_MULTIFD_GROUP), =20 /* Migration capabilities */ DEFINE_PROP_MIG_CAP("x-xbzrle", MIGRATION_CAPABILITY_XBZRLE), @@ -2307,6 +2332,7 @@ static void migration_instance_init(Object *obj) params->has_x_checkpoint_delay =3D true; params->has_block_incremental =3D true; params->has_x_multifd_threads =3D true; + params->has_x_multifd_group =3D true; } =20 /* diff --git a/migration/migration.h b/migration/migration.h index 8e4803d..ddf8c89 100644 --- a/migration/migration.h +++ b/migration/migration.h @@ -176,6 +176,7 @@ bool migrate_zero_blocks(void); bool migrate_auto_converge(void); bool migrate_use_multifd(void); int migrate_multifd_threads(void); +int migrate_multifd_group(void); =20 int migrate_use_xbzrle(void); int64_t migrate_xbzrle_cache_size(void); diff --git a/qapi-schema.json b/qapi-schema.json index 3fe1a64..2d4dbd3 100644 --- a/qapi-schema.json +++ b/qapi-schema.json @@ -1049,6 +1049,9 @@ # number of sockets used for migration. # The default value is 2 (since 2.11) # +# @x-multifd-group: Number of pages sent together to a thread +# The default value is 16 (since 2.11) +# # Since: 2.4 ## { 'enum': 'MigrationParameter', @@ -1056,7 +1059,7 @@ 'cpu-throttle-initial', 'cpu-throttle-increment', 'tls-creds', 'tls-hostname', 'max-bandwidth', 'downtime-limit', 'x-checkpoint-delay', 'block-incremental', - 'x-multifd-threads'] } + 'x-multifd-threads', 'x-multifd-group'] } =20 ## # @MigrateSetParameters: @@ -1117,6 +1120,9 @@ # number of sockets used for migration. # The default value is 2 (since 2.11) # +# @x-multifd-group: Number of pages sent together to a thread +# The default value is 16 (since 2.11) +# # Since: 2.4 ## # TODO either fuse back into MigrationParameters, or make @@ -1133,7 +1139,8 @@ '*downtime-limit': 'int', '*x-checkpoint-delay': 'int', '*block-incremental': 'bool', - '*x-multifd-threads': 'int' } } + '*x-multifd-threads': 'int', + '*x-multifd-group': 'int' } } =20 ## # @migrate-set-parameters: @@ -1209,6 +1216,9 @@ # number of sockets used for migration. # The default value is 2 (since 2.11) # +# @x-multifd-group: Number of pages sent together to a thread +# The default value is 16 (since 2.11) +# # Since: 2.4 ## { 'struct': 'MigrationParameters', @@ -1223,7 +1233,8 @@ '*downtime-limit': 'int', '*x-checkpoint-delay': 'int', '*block-incremental': 'bool', - '*x-multifd-threads': 'int'} } + '*x-multifd-threads': 'int', + '*x-multifd-group': 'int'} } =20 ## # @query-migrate-parameters: --=20 2.9.4 From nobody Fri May 3 10:49:03 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1502209800031541.7343997041069; Tue, 8 Aug 2017 09:30:00 -0700 (PDT) Received: from localhost ([::1]:43573 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1df7OI-00044Y-8z for importer@patchew.org; Tue, 08 Aug 2017 12:29:58 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:58732) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1df7Jg-0000HY-4P for qemu-devel@nongnu.org; Tue, 08 Aug 2017 12:25:13 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1df7Jc-0006hH-1d for qemu-devel@nongnu.org; Tue, 08 Aug 2017 12:25:12 -0400 Received: from mx1.redhat.com ([209.132.183.28]:55856) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1df7Jb-0006fr-Pv for qemu-devel@nongnu.org; Tue, 08 Aug 2017 12:25:08 -0400 Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.phx2.redhat.com [10.5.11.14]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id CCB2F267D5 for ; Tue, 8 Aug 2017 16:25:06 +0000 (UTC) Received: from secure.mitica (ovpn-117-165.ams2.redhat.com [10.36.117.165]) by smtp.corp.redhat.com (Postfix) with ESMTP id 1089D5E241; Tue, 8 Aug 2017 16:24:57 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com CCB2F267D5 Authentication-Results: ext-mx06.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx06.extmail.prod.ext.phx2.redhat.com; spf=fail smtp.mailfrom=quintela@redhat.com From: Juan Quintela To: qemu-devel@nongnu.org Date: Tue, 8 Aug 2017 18:22:14 +0200 Message-Id: <20170808162224.32419-10-quintela@redhat.com> In-Reply-To: <20170808162224.32419-1-quintela@redhat.com> References: <20170808162224.32419-1-quintela@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.14 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.30]); Tue, 08 Aug 2017 16:25:06 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH v6 09/19] migration: Create multifd migration threads X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: lvivier@redhat.com, dgilbert@redhat.com, peterx@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Creation of the threads, nothing inside yet. Signed-off-by: Juan Quintela Reviewed-by: Dr. David Alan Gilbert -- Use pointers instead of long array names Move to use semaphores instead of conditions as paolo suggestion Put all the state inside one struct. Use a counter for the number of threads created. Needed during cancellatio= n. Add error return to thread creation Add id field Rename functions to multifd_save/load_setup/cleanup Change recv parameters to a pointer to struct --- migration/migration.c | 16 ++++- migration/ram.c | 194 ++++++++++++++++++++++++++++++++++++++++++++++= ++++ migration/ram.h | 5 ++ 3 files changed, 214 insertions(+), 1 deletion(-) diff --git a/migration/migration.c b/migration/migration.c index 6c4eb4b..d031c93 100644 --- a/migration/migration.c +++ b/migration/migration.c @@ -296,6 +296,7 @@ static void process_incoming_migration_bh(void *opaque) } else { runstate_set(global_state_get_runstate()); } + multifd_load_cleanup(); /* * This must happen after any state changes since as soon as an extern= al * observer sees this event they might start to prod at the VM assuming @@ -358,6 +359,7 @@ static void process_incoming_migration_co(void *opaque) MIGRATION_STATUS_FAILED); error_report("load of migration failed: %s", strerror(-ret)); qemu_fclose(mis->from_src_file); + multifd_load_cleanup(); exit(EXIT_FAILURE); } mis->bh =3D qemu_bh_new(process_incoming_migration_bh, mis); @@ -368,7 +370,12 @@ void migration_fd_process_incoming(QEMUFile *f) { Coroutine *co =3D qemu_coroutine_create(process_incoming_migration_co,= NULL); MigrationIncomingState *mis =3D migration_incoming_get_current(); - =20 + + if (multifd_load_setup() !=3D 0) { + /* We haven't been able to create multifd threads + nothing better to do */ + exit(EXIT_FAILURE); + } if (!mis->from_src_file) { mis->from_src_file =3D f; } @@ -1028,6 +1035,7 @@ static void migrate_fd_cleanup(void *opaque) } qemu_mutex_lock_iothread(); =20 + multifd_save_cleanup(); qemu_fclose(s->to_dst_file); s->to_dst_file =3D NULL; } @@ -2217,6 +2225,12 @@ void migrate_fd_connect(MigrationState *s) } } =20 + if (multifd_save_setup() !=3D 0) { + migrate_set_state(&s->state, MIGRATION_STATUS_SETUP, + MIGRATION_STATUS_FAILED); + migrate_fd_cleanup(s); + return; + } qemu_thread_create(&s->thread, "live_migration", migration_thread, s, QEMU_THREAD_JOINABLE); s->migration_thread_running =3D true; diff --git a/migration/ram.c b/migration/ram.c index e18b3e2..9fb3496 100644 --- a/migration/ram.c +++ b/migration/ram.c @@ -356,6 +356,200 @@ static void compress_threads_save_setup(void) } } =20 +/* Multiple fd's */ + +struct MultiFDSendParams { + uint8_t id; + QemuThread thread; + QemuSemaphore sem; + QemuMutex mutex; + bool quit; +}; +typedef struct MultiFDSendParams MultiFDSendParams; + +struct { + MultiFDSendParams *params; + /* number of created threads */ + int count; +} *multifd_send_state; + +static void terminate_multifd_send_threads(void) +{ + int i; + + for (i =3D 0; i < multifd_send_state->count; i++) { + MultiFDSendParams *p =3D &multifd_send_state->params[i]; + + qemu_mutex_lock(&p->mutex); + p->quit =3D true; + qemu_sem_post(&p->sem); + qemu_mutex_unlock(&p->mutex); + } +} + +void multifd_save_cleanup(void) +{ + int i; + + if (!migrate_use_multifd()) { + return; + } + terminate_multifd_send_threads(); + for (i =3D 0; i < multifd_send_state->count; i++) { + MultiFDSendParams *p =3D &multifd_send_state->params[i]; + + qemu_thread_join(&p->thread); + qemu_mutex_destroy(&p->mutex); + qemu_sem_destroy(&p->sem); + } + g_free(multifd_send_state->params); + multifd_send_state->params =3D NULL; + g_free(multifd_send_state); + multifd_send_state =3D NULL; +} + +static void *multifd_send_thread(void *opaque) +{ + MultiFDSendParams *p =3D opaque; + + while (true) { + qemu_mutex_lock(&p->mutex); + if (p->quit) { + qemu_mutex_unlock(&p->mutex); + break; + } + qemu_mutex_unlock(&p->mutex); + qemu_sem_wait(&p->sem); + } + + return NULL; +} + +int multifd_save_setup(void) +{ + int thread_count; + uint8_t i; + + if (!migrate_use_multifd()) { + return 0; + } + thread_count =3D migrate_multifd_threads(); + multifd_send_state =3D g_malloc0(sizeof(*multifd_send_state)); + multifd_send_state->params =3D g_new0(MultiFDSendParams, thread_count); + multifd_send_state->count =3D 0; + for (i =3D 0; i < thread_count; i++) { + char thread_name[16]; + MultiFDSendParams *p =3D &multifd_send_state->params[i]; + + qemu_mutex_init(&p->mutex); + qemu_sem_init(&p->sem, 0); + p->quit =3D false; + p->id =3D i; + snprintf(thread_name, sizeof(thread_name), "multifdsend_%d", i); + qemu_thread_create(&p->thread, thread_name, multifd_send_thread, p, + QEMU_THREAD_JOINABLE); + multifd_send_state->count++; + } + return 0; +} + +struct MultiFDRecvParams { + uint8_t id; + QemuThread thread; + QemuSemaphore sem; + QemuMutex mutex; + bool quit; +}; +typedef struct MultiFDRecvParams MultiFDRecvParams; + +struct { + MultiFDRecvParams **params; + /* number of created threads */ + int count; +} *multifd_recv_state; + +static void terminate_multifd_recv_threads(void) +{ + int i; + + for (i =3D 0; i < multifd_recv_state->count; i++) { + MultiFDRecvParams *p =3D multifd_recv_state->params[i]; + + qemu_mutex_lock(&p->mutex); + p->quit =3D true; + qemu_sem_post(&p->sem); + qemu_mutex_unlock(&p->mutex); + } +} + +void multifd_load_cleanup(void) +{ + int i; + + if (!migrate_use_multifd()) { + return; + } + terminate_multifd_recv_threads(); + for (i =3D 0; i < multifd_recv_state->count; i++) { + MultiFDRecvParams *p =3D multifd_recv_state->params[i]; + + qemu_thread_join(&p->thread); + qemu_mutex_destroy(&p->mutex); + qemu_sem_destroy(&p->sem); + g_free(p); + multifd_recv_state->params[i] =3D NULL; + } + g_free(multifd_recv_state->params); + multifd_recv_state->params =3D NULL; + g_free(multifd_recv_state); + multifd_recv_state =3D NULL; +} + +static void *multifd_recv_thread(void *opaque) +{ + MultiFDRecvParams *p =3D opaque; + + while (true) { + qemu_mutex_lock(&p->mutex); + if (p->quit) { + qemu_mutex_unlock(&p->mutex); + break; + } + qemu_mutex_unlock(&p->mutex); + qemu_sem_wait(&p->sem); + } + + return NULL; +} + +int multifd_load_setup(void) +{ + int thread_count; + uint8_t i; + + if (!migrate_use_multifd()) { + return 0; + } + thread_count =3D migrate_multifd_threads(); + multifd_recv_state =3D g_malloc0(sizeof(*multifd_recv_state)); + multifd_recv_state->params =3D g_new0(MultiFDRecvParams *, thread_coun= t); + multifd_recv_state->count =3D 0; + for (i =3D 0; i < thread_count; i++) { + char thread_name[16]; + MultiFDRecvParams *p =3D multifd_recv_state->params[i]; + + qemu_mutex_init(&p->mutex); + qemu_sem_init(&p->sem, 0); + p->quit =3D false; + p->id =3D i; + snprintf(thread_name, sizeof(thread_name), "multifdrecv_%d", i); + qemu_thread_create(&p->thread, thread_name, multifd_recv_thread, p, + QEMU_THREAD_JOINABLE); + multifd_recv_state->count++; + } + return 0; +} + /** * save_page_header: write page header to wire * diff --git a/migration/ram.h b/migration/ram.h index c081fde..93c2bb4 100644 --- a/migration/ram.h +++ b/migration/ram.h @@ -39,6 +39,11 @@ int64_t xbzrle_cache_resize(int64_t new_size); uint64_t ram_bytes_remaining(void); uint64_t ram_bytes_total(void); =20 +int multifd_save_setup(void); +void multifd_save_cleanup(void); +int multifd_load_setup(void); +void multifd_load_cleanup(void); + uint64_t ram_pagesize_summary(void); int ram_save_queue_pages(const char *rbname, ram_addr_t start, ram_addr_t = len); void acct_update_position(QEMUFile *f, size_t size, bool zero); --=20 2.9.4 From nobody Fri May 3 10:49:03 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1502209956614575.9719437942238; Tue, 8 Aug 2017 09:32:36 -0700 (PDT) Received: from localhost ([::1]:43588 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1df7Qp-0006W3-CP for importer@patchew.org; Tue, 08 Aug 2017 12:32:35 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:58825) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1df7Jq-0000Ra-2b for qemu-devel@nongnu.org; Tue, 08 Aug 2017 12:25:23 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1df7Jm-0006v5-0Y for qemu-devel@nongnu.org; Tue, 08 Aug 2017 12:25:22 -0400 Received: from mx1.redhat.com ([209.132.183.28]:39186) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1df7Jl-0006ue-Qj for qemu-devel@nongnu.org; Tue, 08 Aug 2017 12:25:17 -0400 Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.phx2.redhat.com [10.5.11.14]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id B96987C852 for ; Tue, 8 Aug 2017 16:25:16 +0000 (UTC) Received: from secure.mitica (ovpn-117-165.ams2.redhat.com [10.36.117.165]) by smtp.corp.redhat.com (Postfix) with ESMTP id 22A4E5E241; Tue, 8 Aug 2017 16:25:06 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com B96987C852 Authentication-Results: ext-mx03.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx03.extmail.prod.ext.phx2.redhat.com; spf=fail smtp.mailfrom=quintela@redhat.com From: Juan Quintela To: qemu-devel@nongnu.org Date: Tue, 8 Aug 2017 18:22:15 +0200 Message-Id: <20170808162224.32419-11-quintela@redhat.com> In-Reply-To: <20170808162224.32419-1-quintela@redhat.com> References: <20170808162224.32419-1-quintela@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.14 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.27]); Tue, 08 Aug 2017 16:25:17 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH v6 10/19] migration: Split migration_fd_process_incoming X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: lvivier@redhat.com, dgilbert@redhat.com, peterx@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" We need that on later patches. Signed-off-by: Juan Quintela Reviewed-by: Dr. David Alan Gilbert --- migration/migration.c | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/migration/migration.c b/migration/migration.c index d031c93..e36e880 100644 --- a/migration/migration.c +++ b/migration/migration.c @@ -366,9 +366,8 @@ static void process_incoming_migration_co(void *opaque) qemu_bh_schedule(mis->bh); } =20 -void migration_fd_process_incoming(QEMUFile *f) +static void migration_incoming_setup(QEMUFile *f) { - Coroutine *co =3D qemu_coroutine_create(process_incoming_migration_co,= NULL); MigrationIncomingState *mis =3D migration_incoming_get_current(); =20 if (multifd_load_setup() !=3D 0) { @@ -380,9 +379,20 @@ void migration_fd_process_incoming(QEMUFile *f) mis->from_src_file =3D f; } qemu_file_set_blocking(f, false); +} + +static void migration_incoming_process(void) +{ + Coroutine *co =3D qemu_coroutine_create(process_incoming_migration_co,= NULL); qemu_coroutine_enter(co); } =20 +void migration_fd_process_incoming(QEMUFile *f) +{ + migration_incoming_setup(f); + migration_incoming_process(); +} + void migration_ioc_process_incoming(QIOChannel *ioc) { MigrationIncomingState *mis =3D migration_incoming_get_current(); --=20 2.9.4 From nobody Fri May 3 10:49:03 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1502209755172394.31861304094843; Tue, 8 Aug 2017 09:29:15 -0700 (PDT) Received: from localhost ([::1]:43570 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1df7NZ-0003Ot-Ew for importer@patchew.org; Tue, 08 Aug 2017 12:29:13 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:58845) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1df7Jr-0000Sg-Tp for qemu-devel@nongnu.org; Tue, 08 Aug 2017 12:25:25 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1df7Jq-0006xA-12 for qemu-devel@nongnu.org; Tue, 08 Aug 2017 12:25:23 -0400 Received: from mx1.redhat.com ([209.132.183.28]:35028) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1df7Jp-0006wk-Me for qemu-devel@nongnu.org; Tue, 08 Aug 2017 12:25:21 -0400 Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.phx2.redhat.com [10.5.11.14]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 95A56C047B7D for ; Tue, 8 Aug 2017 16:25:20 +0000 (UTC) Received: from secure.mitica (ovpn-117-165.ams2.redhat.com [10.36.117.165]) by smtp.corp.redhat.com (Postfix) with ESMTP id 921B96C203; Tue, 8 Aug 2017 16:25:12 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 95A56C047B7D Authentication-Results: ext-mx07.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx07.extmail.prod.ext.phx2.redhat.com; spf=fail smtp.mailfrom=quintela@redhat.com From: Juan Quintela To: qemu-devel@nongnu.org Date: Tue, 8 Aug 2017 18:22:16 +0200 Message-Id: <20170808162224.32419-12-quintela@redhat.com> In-Reply-To: <20170808162224.32419-1-quintela@redhat.com> References: <20170808162224.32419-1-quintela@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.14 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.31]); Tue, 08 Aug 2017 16:25:20 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH v6 11/19] migration: Start of multiple fd work X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: lvivier@redhat.com, dgilbert@redhat.com, peterx@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" We create new channels for each new thread created. We send through them a string containing multifd so we are sure that we connect the right channels in both sides. Signed-off-by: Juan Quintela -- Split SocketArgs into incoming and outgoing args Use UUID's on the initial message, so we are sure we are connecting to the right channel. Remove init semaphore. Now that we use uuids on the init message, we know that this is our channel. Fix recv socket destwroy, we were destroying send channels. This was very interesting, because we were using an unreferred object without problems. Move to struct of pointers init channel sooner. split recv thread creation. listen on main thread We count the number of created threads to know when we need to stop listeni= ng Use g_strdup_printf report channel id on errors --- migration/migration.c | 5 +++ migration/ram.c | 99 +++++++++++++++++++++++++++++++++++++++++++----= ---- migration/ram.h | 3 ++ migration/socket.c | 36 ++++++++++++++++++- migration/socket.h | 10 ++++++ 5 files changed, 138 insertions(+), 15 deletions(-) diff --git a/migration/migration.c b/migration/migration.c index e36e880..944d6e2 100644 --- a/migration/migration.c +++ b/migration/migration.c @@ -413,6 +413,11 @@ void migration_ioc_process_incoming(QIOChannel *ioc) */ bool migration_has_all_channels(void) { + if (migrate_use_multifd()) { + int thread_count =3D migrate_multifd_threads(); + + return thread_count =3D=3D multifd_created_threads(); + } return true; } =20 diff --git a/migration/ram.c b/migration/ram.c index 9fb3496..e9fa556 100644 --- a/migration/ram.c +++ b/migration/ram.c @@ -36,6 +36,7 @@ #include "xbzrle.h" #include "ram.h" #include "migration.h" +#include "socket.h" #include "migration/register.h" #include "migration/misc.h" #include "qemu-file.h" @@ -46,6 +47,8 @@ #include "exec/ram_addr.h" #include "qemu/rcu_queue.h" #include "migration/colo.h" +#include "sysemu/sysemu.h" +#include "qemu/uuid.h" =20 /***********************************************************/ /* ram save/restore */ @@ -361,6 +364,7 @@ static void compress_threads_save_setup(void) struct MultiFDSendParams { uint8_t id; QemuThread thread; + QIOChannel *c; QemuSemaphore sem; QemuMutex mutex; bool quit; @@ -401,6 +405,7 @@ void multifd_save_cleanup(void) qemu_thread_join(&p->thread); qemu_mutex_destroy(&p->mutex); qemu_sem_destroy(&p->sem); + socket_send_channel_destroy(p->c); } g_free(multifd_send_state->params); multifd_send_state->params =3D NULL; @@ -408,9 +413,26 @@ void multifd_save_cleanup(void) multifd_send_state =3D NULL; } =20 +/* Default uuid for multifd when qemu is not started with uuid */ +static char multifd_uuid[] =3D "5c49fd7e-af88-4a07-b6e8-091fd696ad40"; +/* strlen(multifd) + '-' + + '-' + UUID_FMT + '\0' */ +#define MULTIFD_UUID_MSG (7 + 1 + 3 + 1 + UUID_FMT_LEN + 1) + static void *multifd_send_thread(void *opaque) { MultiFDSendParams *p =3D opaque; + char *string; + char *string_uuid; + + if (qemu_uuid_set) { + string_uuid =3D qemu_uuid_unparse_strdup(&qemu_uuid); + } else { + string_uuid =3D g_strdup(multifd_uuid); + } + string =3D g_strdup_printf("%s multifd %03d", string_uuid, p->id); + g_free(string_uuid); + qio_channel_write(p->c, string, MULTIFD_UUID_MSG, &error_abort); + g_free(string); =20 while (true) { qemu_mutex_lock(&p->mutex); @@ -445,6 +467,12 @@ int multifd_save_setup(void) qemu_sem_init(&p->sem, 0); p->quit =3D false; p->id =3D i; + p->c =3D socket_send_channel_create(); + if (!p->c) { + error_report("Error creating a send channel"); + multifd_save_cleanup(); + return -1; + } snprintf(thread_name, sizeof(thread_name), "multifdsend_%d", i); qemu_thread_create(&p->thread, thread_name, multifd_send_thread, p, QEMU_THREAD_JOINABLE); @@ -456,6 +484,7 @@ int multifd_save_setup(void) struct MultiFDRecvParams { uint8_t id; QemuThread thread; + QIOChannel *c; QemuSemaphore sem; QemuMutex mutex; bool quit; @@ -466,12 +495,16 @@ struct { MultiFDRecvParams **params; /* number of created threads */ int count; + /* Should we finish */ + bool quit; } *multifd_recv_state; =20 static void terminate_multifd_recv_threads(void) { int i; =20 + multifd_recv_state->quit =3D true; + for (i =3D 0; i < multifd_recv_state->count; i++) { MultiFDRecvParams *p =3D multifd_recv_state->params[i]; =20 @@ -496,6 +529,7 @@ void multifd_load_cleanup(void) qemu_thread_join(&p->thread); qemu_mutex_destroy(&p->mutex); qemu_sem_destroy(&p->sem); + socket_recv_channel_destroy(p->c); g_free(p); multifd_recv_state->params[i] =3D NULL; } @@ -522,10 +556,54 @@ static void *multifd_recv_thread(void *opaque) return NULL; } =20 +void multifd_new_channel(QIOChannel *ioc) +{ + MultiFDRecvParams *p =3D g_new0(MultiFDRecvParams, 1); + MigrationState *s =3D migrate_get_current(); + char string[MULTIFD_UUID_MSG]; + char string_uuid[UUID_FMT_LEN]; + char *uuid; + int id; + + qio_channel_read(ioc, string, sizeof(string), &error_abort); + sscanf(string, "%s multifd %03d", string_uuid, &id); + + if (qemu_uuid_set) { + uuid =3D qemu_uuid_unparse_strdup(&qemu_uuid); + } else { + uuid =3D g_strdup(multifd_uuid); + } + if (strcmp(string_uuid, uuid)) { + error_report("multifd: received uuid '%s' and expected uuid '%s'" + " for channel %d", string_uuid, uuid, id); + migrate_set_state(&s->state, MIGRATION_STATUS_ACTIVE, + MIGRATION_STATUS_FAILED); + terminate_multifd_recv_threads(); + return; + } + g_free(uuid); + + if (multifd_recv_state->params[id] !=3D NULL) { + error_report("multifd: received id '%d' is already setup'", id); + migrate_set_state(&s->state, MIGRATION_STATUS_ACTIVE, + MIGRATION_STATUS_FAILED); + terminate_multifd_recv_threads(); + return; + } + qemu_mutex_init(&p->mutex); + qemu_sem_init(&p->sem, 0); + p->quit =3D false; + p->id =3D id; + p->c =3D ioc; + atomic_set(&multifd_recv_state->params[id], p); + multifd_recv_state->count++; + qemu_thread_create(&p->thread, "multifd_recv", multifd_recv_thread, p, + QEMU_THREAD_JOINABLE); +} + int multifd_load_setup(void) { int thread_count; - uint8_t i; =20 if (!migrate_use_multifd()) { return 0; @@ -534,22 +612,15 @@ int multifd_load_setup(void) multifd_recv_state =3D g_malloc0(sizeof(*multifd_recv_state)); multifd_recv_state->params =3D g_new0(MultiFDRecvParams *, thread_coun= t); multifd_recv_state->count =3D 0; - for (i =3D 0; i < thread_count; i++) { - char thread_name[16]; - MultiFDRecvParams *p =3D multifd_recv_state->params[i]; - - qemu_mutex_init(&p->mutex); - qemu_sem_init(&p->sem, 0); - p->quit =3D false; - p->id =3D i; - snprintf(thread_name, sizeof(thread_name), "multifdrecv_%d", i); - qemu_thread_create(&p->thread, thread_name, multifd_recv_thread, p, - QEMU_THREAD_JOINABLE); - multifd_recv_state->count++; - } + multifd_recv_state->quit =3D false; return 0; } =20 +int multifd_created_threads(void) +{ + return multifd_recv_state->count; +} + /** * save_page_header: write page header to wire * diff --git a/migration/ram.h b/migration/ram.h index 93c2bb4..b3dabf2 100644 --- a/migration/ram.h +++ b/migration/ram.h @@ -31,6 +31,7 @@ =20 #include "qemu-common.h" #include "exec/cpu-common.h" +#include "io/channel.h" =20 extern MigrationStats ram_counters; extern XBZRLECacheStats xbzrle_counters; @@ -43,6 +44,8 @@ int multifd_save_setup(void); void multifd_save_cleanup(void); int multifd_load_setup(void); void multifd_load_cleanup(void); +void multifd_new_channel(QIOChannel *ioc); +int multifd_created_threads(void); =20 uint64_t ram_pagesize_summary(void); int ram_save_queue_pages(const char *rbname, ram_addr_t start, ram_addr_t = len); diff --git a/migration/socket.c b/migration/socket.c index dee8690..5dd6f42 100644 --- a/migration/socket.c +++ b/migration/socket.c @@ -26,6 +26,38 @@ #include "io/channel-socket.h" #include "trace.h" =20 +int socket_recv_channel_destroy(QIOChannel *recv) +{ + /* Remove channel */ + object_unref(OBJECT(recv)); + return 0; +} + +struct SocketOutgoingArgs { + SocketAddress *saddr; + Error **errp; +} outgoing_args; + +QIOChannel *socket_send_channel_create(void) +{ + QIOChannelSocket *sioc =3D qio_channel_socket_new(); + + qio_channel_socket_connect_sync(sioc, outgoing_args.saddr, + outgoing_args.errp); + qio_channel_set_delay(QIO_CHANNEL(sioc), false); + return QIO_CHANNEL(sioc); +} + +int socket_send_channel_destroy(QIOChannel *send) +{ + /* Remove channel */ + object_unref(OBJECT(send)); + if (outgoing_args.saddr) { + qapi_free_SocketAddress(outgoing_args.saddr); + outgoing_args.saddr =3D NULL; + } + return 0; +} =20 static SocketAddress *tcp_build_address(const char *host_port, Error **err= p) { @@ -96,6 +128,9 @@ static void socket_start_outgoing_migration(MigrationSta= te *s, struct SocketConnectData *data =3D g_new0(struct SocketConnectData, 1); =20 data->s =3D s; + outgoing_args.saddr =3D saddr; + outgoing_args.errp =3D errp; + if (saddr->type =3D=3D SOCKET_ADDRESS_TYPE_INET) { data->hostname =3D g_strdup(saddr->u.inet.host); } @@ -106,7 +141,6 @@ static void socket_start_outgoing_migration(MigrationSt= ate *s, socket_outgoing_migration, data, socket_connect_data_free); - qapi_free_SocketAddress(saddr); } =20 void tcp_start_outgoing_migration(MigrationState *s, diff --git a/migration/socket.h b/migration/socket.h index 6b91e9d..dabce0e 100644 --- a/migration/socket.h +++ b/migration/socket.h @@ -16,6 +16,16 @@ =20 #ifndef QEMU_MIGRATION_SOCKET_H #define QEMU_MIGRATION_SOCKET_H + +#include "io/channel.h" + +QIOChannel *socket_recv_channel_create(void); +int socket_recv_channel_destroy(QIOChannel *recv); + +QIOChannel *socket_send_channel_create(void); + +int socket_send_channel_destroy(QIOChannel *send); + void tcp_start_incoming_migration(const char *host_port, Error **errp); =20 void tcp_start_outgoing_migration(MigrationState *s, const char *host_port, --=20 2.9.4 From nobody Fri May 3 10:49:03 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1502210123461771.84527207425; Tue, 8 Aug 2017 09:35:23 -0700 (PDT) Received: from localhost ([::1]:43596 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1df7TV-0000Qj-Qu for importer@patchew.org; Tue, 08 Aug 2017 12:35:21 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:58886) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1df7Jx-0000X8-29 for qemu-devel@nongnu.org; Tue, 08 Aug 2017 12:25:33 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1df7Jv-00070c-Dd for qemu-devel@nongnu.org; Tue, 08 Aug 2017 12:25:29 -0400 Received: from mx1.redhat.com ([209.132.183.28]:49586) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1df7Jv-00070G-4B for qemu-devel@nongnu.org; Tue, 08 Aug 2017 12:25:27 -0400 Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.phx2.redhat.com [10.5.11.14]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 1F42C6E80A for ; Tue, 8 Aug 2017 16:25:26 +0000 (UTC) Received: from secure.mitica (ovpn-117-165.ams2.redhat.com [10.36.117.165]) by smtp.corp.redhat.com (Postfix) with ESMTP id B70D45E27D; Tue, 8 Aug 2017 16:25:18 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 1F42C6E80A Authentication-Results: ext-mx02.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx02.extmail.prod.ext.phx2.redhat.com; spf=fail smtp.mailfrom=quintela@redhat.com From: Juan Quintela To: qemu-devel@nongnu.org Date: Tue, 8 Aug 2017 18:22:17 +0200 Message-Id: <20170808162224.32419-13-quintela@redhat.com> In-Reply-To: <20170808162224.32419-1-quintela@redhat.com> References: <20170808162224.32419-1-quintela@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.14 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.26]); Tue, 08 Aug 2017 16:25:26 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH v6 12/19] migration: Create ram_multifd_page X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: lvivier@redhat.com, dgilbert@redhat.com, peterx@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" The function still don't use multifd, but we have simplified ram_save_page, xbzrle and RDMA stuff is gone. We have added a new counter and a new flag for this type of pages. Signed-off-by: Juan Quintela -- Add last_page parameter Add commets for done and address --- hmp.c | 2 ++ migration/migration.c | 1 + migration/ram.c | 94 +++++++++++++++++++++++++++++++++++++++++++++++= +++- qapi-schema.json | 5 ++- 4 files changed, 100 insertions(+), 2 deletions(-) diff --git a/hmp.c b/hmp.c index a52035a..bc2b071 100644 --- a/hmp.c +++ b/hmp.c @@ -234,6 +234,8 @@ void hmp_info_migrate(Monitor *mon, const QDict *qdict) monitor_printf(mon, "postcopy request count: %" PRIu64 "\n", info->ram->postcopy_requests); } + monitor_printf(mon, "multifd: %" PRIu64 " pages\n", + info->ram->multifd); } =20 if (info->has_disk) { diff --git a/migration/migration.c b/migration/migration.c index 944d6e2..8e9505a 100644 --- a/migration/migration.c +++ b/migration/migration.c @@ -549,6 +549,7 @@ static void populate_ram_info(MigrationInfo *info, Migr= ationState *s) info->ram->dirty_sync_count =3D ram_counters.dirty_sync_count; info->ram->postcopy_requests =3D ram_counters.postcopy_requests; info->ram->page_size =3D qemu_target_page_size(); + info->ram->multifd =3D ram_counters.multifd; =20 if (migrate_use_xbzrle()) { info->has_xbzrle_cache =3D true; diff --git a/migration/ram.c b/migration/ram.c index e9fa556..03f3427 100644 --- a/migration/ram.c +++ b/migration/ram.c @@ -68,6 +68,7 @@ #define RAM_SAVE_FLAG_XBZRLE 0x40 /* 0x80 is reserved in migration.h start with 0x100 next */ #define RAM_SAVE_FLAG_COMPRESS_PAGE 0x100 +#define RAM_SAVE_FLAG_MULTIFD_PAGE 0x200 =20 static inline bool is_zero_range(uint8_t *p, uint64_t size) { @@ -362,12 +363,22 @@ static void compress_threads_save_setup(void) /* Multiple fd's */ =20 struct MultiFDSendParams { + /* not changed */ uint8_t id; QemuThread thread; QIOChannel *c; QemuSemaphore sem; QemuMutex mutex; + /* protected by param mutex */ bool quit; + /* This is a temp field. We are using it now to transmit + something the address of the page. Later in the series, we + change it for the real page. + */ + uint8_t *address; + /* protected by multifd mutex */ + /* has the thread finish the last submitted job */ + bool done; }; typedef struct MultiFDSendParams MultiFDSendParams; =20 @@ -375,6 +386,8 @@ struct { MultiFDSendParams *params; /* number of created threads */ int count; + QemuMutex mutex; + QemuSemaphore sem; } *multifd_send_state; =20 static void terminate_multifd_send_threads(void) @@ -433,6 +446,7 @@ static void *multifd_send_thread(void *opaque) g_free(string_uuid); qio_channel_write(p->c, string, MULTIFD_UUID_MSG, &error_abort); g_free(string); + qemu_sem_post(&multifd_send_state->sem); =20 while (true) { qemu_mutex_lock(&p->mutex); @@ -440,6 +454,15 @@ static void *multifd_send_thread(void *opaque) qemu_mutex_unlock(&p->mutex); break; } + if (p->address) { + p->address =3D 0; + qemu_mutex_unlock(&p->mutex); + qemu_mutex_lock(&multifd_send_state->mutex); + p->done =3D true; + qemu_mutex_unlock(&multifd_send_state->mutex); + qemu_sem_post(&multifd_send_state->sem); + continue; + } qemu_mutex_unlock(&p->mutex); qemu_sem_wait(&p->sem); } @@ -459,6 +482,8 @@ int multifd_save_setup(void) multifd_send_state =3D g_malloc0(sizeof(*multifd_send_state)); multifd_send_state->params =3D g_new0(MultiFDSendParams, thread_count); multifd_send_state->count =3D 0; + qemu_mutex_init(&multifd_send_state->mutex); + qemu_sem_init(&multifd_send_state->sem, 0); for (i =3D 0; i < thread_count; i++) { char thread_name[16]; MultiFDSendParams *p =3D &multifd_send_state->params[i]; @@ -467,6 +492,8 @@ int multifd_save_setup(void) qemu_sem_init(&p->sem, 0); p->quit =3D false; p->id =3D i; + p->done =3D true; + p->address =3D 0; p->c =3D socket_send_channel_create(); if (!p->c) { error_report("Error creating a send channel"); @@ -481,6 +508,30 @@ int multifd_save_setup(void) return 0; } =20 +static uint16_t multifd_send_page(uint8_t *address, bool last_page) +{ + int i; + MultiFDSendParams *p =3D NULL; /* make happy gcc */ + + qemu_sem_wait(&multifd_send_state->sem); + qemu_mutex_lock(&multifd_send_state->mutex); + for (i =3D 0; i < multifd_send_state->count; i++) { + p =3D &multifd_send_state->params[i]; + + if (p->done) { + p->done =3D false; + break; + } + } + qemu_mutex_unlock(&multifd_send_state->mutex); + qemu_mutex_lock(&p->mutex); + p->address =3D address; + qemu_mutex_unlock(&p->mutex); + qemu_sem_post(&p->sem); + + return 0; +} + struct MultiFDRecvParams { uint8_t id; QemuThread thread; @@ -1051,6 +1102,32 @@ static int ram_save_page(RAMState *rs, PageSearchSta= tus *pss, bool last_stage) return pages; } =20 +static int ram_multifd_page(RAMState *rs, PageSearchStatus *pss, + bool last_stage) +{ + int pages; + uint8_t *p; + RAMBlock *block =3D pss->block; + ram_addr_t offset =3D pss->page << TARGET_PAGE_BITS; + + p =3D block->host + offset; + + pages =3D save_zero_page(rs, block, offset, p); + if (pages =3D=3D -1) { + ram_counters.transferred +=3D + save_page_header(rs, rs->f, block, + offset | RAM_SAVE_FLAG_MULTIFD_PAGE); + qemu_put_buffer(rs->f, p, TARGET_PAGE_SIZE); + multifd_send_page(p, rs->migration_dirty_pages =3D=3D 1); + ram_counters.transferred +=3D TARGET_PAGE_SIZE; + pages =3D 1; + ram_counters.normal++; + ram_counters.multifd++; + } + + return pages; +} + static int do_compress_ram_page(QEMUFile *f, RAMBlock *block, ram_addr_t offset) { @@ -1479,6 +1556,8 @@ static int ram_save_target_page(RAMState *rs, PageSea= rchStatus *pss, if (migrate_use_compression() && (rs->ram_bulk_stage || !migrate_use_xbzrle())) { res =3D ram_save_compressed_page(rs, pss, last_stage); + } else if (migrate_use_multifd()) { + res =3D ram_multifd_page(rs, pss, last_stage); } else { res =3D ram_save_page(rs, pss, last_stage); } @@ -2771,6 +2850,10 @@ static int ram_load(QEMUFile *f, void *opaque, int v= ersion_id) if (!migrate_use_compression()) { invalid_flags |=3D RAM_SAVE_FLAG_COMPRESS_PAGE; } + + if (!migrate_use_multifd()) { + invalid_flags |=3D RAM_SAVE_FLAG_MULTIFD_PAGE; + } /* This RCU critical section can be very long running. * When RCU reclaims in the code start to become numerous, * it will be necessary to reduce the granularity of this @@ -2795,13 +2878,17 @@ static int ram_load(QEMUFile *f, void *opaque, int = version_id) if (flags & invalid_flags & RAM_SAVE_FLAG_COMPRESS_PAGE) { error_report("Received an unexpected compressed page"); } + if (flags & invalid_flags & RAM_SAVE_FLAG_MULTIFD_PAGE) { + error_report("Received an unexpected multifd page"); + } =20 ret =3D -EINVAL; break; } =20 if (flags & (RAM_SAVE_FLAG_ZERO | RAM_SAVE_FLAG_PAGE | - RAM_SAVE_FLAG_COMPRESS_PAGE | RAM_SAVE_FLAG_XBZRLE)) { + RAM_SAVE_FLAG_COMPRESS_PAGE | RAM_SAVE_FLAG_XBZRLE | + RAM_SAVE_FLAG_MULTIFD_PAGE)) { RAMBlock *block =3D ram_block_from_stream(f, flags); =20 host =3D host_from_ram_block_offset(block, addr); @@ -2889,6 +2976,11 @@ static int ram_load(QEMUFile *f, void *opaque, int v= ersion_id) break; } break; + + case RAM_SAVE_FLAG_MULTIFD_PAGE: + qemu_get_buffer(f, host, TARGET_PAGE_SIZE); + break; + case RAM_SAVE_FLAG_EOS: /* normal exit */ break; diff --git a/qapi-schema.json b/qapi-schema.json index 2d4dbd3..bb1fe0a 100644 --- a/qapi-schema.json +++ b/qapi-schema.json @@ -617,6 +617,8 @@ # @page-size: The number of bytes per page for the various page-based # statistics (since 2.10) # +# @multifd: number of pages sent with multifd (since 2.10) +# # Since: 0.14.0 ## { 'struct': 'MigrationStats', @@ -624,7 +626,8 @@ 'duplicate': 'int', 'skipped': 'int', 'normal': 'int', 'normal-bytes': 'int', 'dirty-pages-rate' : 'int', 'mbps' : 'number', 'dirty-sync-count' : 'int', - 'postcopy-requests' : 'int', 'page-size' : 'int' } } + 'postcopy-requests' : 'int', 'page-size' : 'int', + 'multifd' : 'int'} } =20 ## # @XBZRLECacheStats: --=20 2.9.4 From nobody Fri May 3 10:49:03 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 150220977612978.1820525518209; Tue, 8 Aug 2017 09:29:36 -0700 (PDT) Received: from localhost ([::1]:43571 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1df7Nu-0003jk-Q0 for importer@patchew.org; Tue, 08 Aug 2017 12:29:34 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:58947) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1df7K2-0000dC-IX for qemu-devel@nongnu.org; Tue, 08 Aug 2017 12:25:35 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1df7K1-000743-66 for qemu-devel@nongnu.org; Tue, 08 Aug 2017 12:25:34 -0400 Received: from mx1.redhat.com ([209.132.183.28]:33150) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1df7K0-00073e-Tu for qemu-devel@nongnu.org; Tue, 08 Aug 2017 12:25:33 -0400 Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.phx2.redhat.com [10.5.11.14]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 9E94D13A47 for ; Tue, 8 Aug 2017 16:25:31 +0000 (UTC) Received: from secure.mitica (ovpn-117-165.ams2.redhat.com [10.36.117.165]) by smtp.corp.redhat.com (Postfix) with ESMTP id 6815A18B93; Tue, 8 Aug 2017 16:25:26 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 9E94D13A47 Authentication-Results: ext-mx05.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx05.extmail.prod.ext.phx2.redhat.com; spf=fail smtp.mailfrom=quintela@redhat.com From: Juan Quintela To: qemu-devel@nongnu.org Date: Tue, 8 Aug 2017 18:22:18 +0200 Message-Id: <20170808162224.32419-14-quintela@redhat.com> In-Reply-To: <20170808162224.32419-1-quintela@redhat.com> References: <20170808162224.32419-1-quintela@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.14 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.29]); Tue, 08 Aug 2017 16:25:31 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH v6 13/19] migration: Really use multiple pages at a time X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: lvivier@redhat.com, dgilbert@redhat.com, peterx@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" We now send several pages at a time each time that we wakeup a thread. Signed-off-by: Juan Quintela -- Use iovec's instead of creating the equivalent. Clear memory used by pages (dave) Use g_new0(danp) define MULTIFD_CONTINUE --- migration/ram.c | 57 ++++++++++++++++++++++++++++++++++++++++++++++++-----= ---- 1 file changed, 48 insertions(+), 9 deletions(-) diff --git a/migration/ram.c b/migration/ram.c index 03f3427..7310da9 100644 --- a/migration/ram.c +++ b/migration/ram.c @@ -49,6 +49,7 @@ #include "migration/colo.h" #include "sysemu/sysemu.h" #include "qemu/uuid.h" +#include "qemu/iov.h" =20 /***********************************************************/ /* ram save/restore */ @@ -362,6 +363,15 @@ static void compress_threads_save_setup(void) =20 /* Multiple fd's */ =20 +/* used to continue on the same multifd group */ +#define MULTIFD_CONTINUE UINT16_MAX + +typedef struct { + int num; + size_t size; + struct iovec *iov; +} multifd_pages_t; + struct MultiFDSendParams { /* not changed */ uint8_t id; @@ -371,11 +381,7 @@ struct MultiFDSendParams { QemuMutex mutex; /* protected by param mutex */ bool quit; - /* This is a temp field. We are using it now to transmit - something the address of the page. Later in the series, we - change it for the real page. - */ - uint8_t *address; + multifd_pages_t pages; /* protected by multifd mutex */ /* has the thread finish the last submitted job */ bool done; @@ -388,8 +394,24 @@ struct { int count; QemuMutex mutex; QemuSemaphore sem; + multifd_pages_t pages; } *multifd_send_state; =20 +static void multifd_init_group(multifd_pages_t *pages) +{ + pages->num =3D 0; + pages->size =3D migrate_multifd_group(); + pages->iov =3D g_new0(struct iovec, pages->size); +} + +static void multifd_clear_group(multifd_pages_t *pages) +{ + pages->num =3D 0; + pages->size =3D 0; + g_free(pages->iov); + pages->iov =3D NULL; +} + static void terminate_multifd_send_threads(void) { int i; @@ -419,9 +441,11 @@ void multifd_save_cleanup(void) qemu_mutex_destroy(&p->mutex); qemu_sem_destroy(&p->sem); socket_send_channel_destroy(p->c); + multifd_clear_group(&p->pages); } g_free(multifd_send_state->params); multifd_send_state->params =3D NULL; + multifd_clear_group(&multifd_send_state->pages); g_free(multifd_send_state); multifd_send_state =3D NULL; } @@ -454,8 +478,8 @@ static void *multifd_send_thread(void *opaque) qemu_mutex_unlock(&p->mutex); break; } - if (p->address) { - p->address =3D 0; + if (p->pages.num) { + p->pages.num =3D 0; qemu_mutex_unlock(&p->mutex); qemu_mutex_lock(&multifd_send_state->mutex); p->done =3D true; @@ -484,6 +508,7 @@ int multifd_save_setup(void) multifd_send_state->count =3D 0; qemu_mutex_init(&multifd_send_state->mutex); qemu_sem_init(&multifd_send_state->sem, 0); + multifd_init_group(&multifd_send_state->pages); for (i =3D 0; i < thread_count; i++) { char thread_name[16]; MultiFDSendParams *p =3D &multifd_send_state->params[i]; @@ -493,7 +518,7 @@ int multifd_save_setup(void) p->quit =3D false; p->id =3D i; p->done =3D true; - p->address =3D 0; + multifd_init_group(&p->pages); p->c =3D socket_send_channel_create(); if (!p->c) { error_report("Error creating a send channel"); @@ -512,6 +537,17 @@ static uint16_t multifd_send_page(uint8_t *address, bo= ol last_page) { int i; MultiFDSendParams *p =3D NULL; /* make happy gcc */ + multifd_pages_t *pages =3D &multifd_send_state->pages; + + pages->iov[pages->num].iov_base =3D address; + pages->iov[pages->num].iov_len =3D TARGET_PAGE_SIZE; + pages->num++; + + if (!last_page) { + if (pages->num < (pages->size - 1)) { + return MULTIFD_CONTINUE; + } + } =20 qemu_sem_wait(&multifd_send_state->sem); qemu_mutex_lock(&multifd_send_state->mutex); @@ -525,7 +561,10 @@ static uint16_t multifd_send_page(uint8_t *address, bo= ol last_page) } qemu_mutex_unlock(&multifd_send_state->mutex); qemu_mutex_lock(&p->mutex); - p->address =3D address; + p->pages.num =3D pages->num; + iov_copy(p->pages.iov, pages->num, pages->iov, pages->num, 0, + iov_size(pages->iov, pages->num)); + pages->num =3D 0; qemu_mutex_unlock(&p->mutex); qemu_sem_post(&p->sem); =20 --=20 2.9.4 From nobody Fri May 3 10:49:03 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1502210193107380.11162867790006; Tue, 8 Aug 2017 09:36:33 -0700 (PDT) Received: from localhost ([::1]:43606 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1df7Ud-0001aT-Oq for importer@patchew.org; Tue, 08 Aug 2017 12:36:31 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:58979) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1df7K5-0000gB-KO for qemu-devel@nongnu.org; Tue, 08 Aug 2017 12:25:38 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1df7K4-00075f-6x for qemu-devel@nongnu.org; Tue, 08 Aug 2017 12:25:37 -0400 Received: from mx1.redhat.com ([209.132.183.28]:32816) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1df7K4-00075F-0e for qemu-devel@nongnu.org; Tue, 08 Aug 2017 12:25:36 -0400 Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.phx2.redhat.com [10.5.11.14]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 15461356DC for ; Tue, 8 Aug 2017 16:25:35 +0000 (UTC) Received: from secure.mitica (ovpn-117-165.ams2.redhat.com [10.36.117.165]) by smtp.corp.redhat.com (Postfix) with ESMTP id ABC0E5E270; Tue, 8 Aug 2017 16:25:31 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 15461356DC Authentication-Results: ext-mx06.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx06.extmail.prod.ext.phx2.redhat.com; spf=fail smtp.mailfrom=quintela@redhat.com From: Juan Quintela To: qemu-devel@nongnu.org Date: Tue, 8 Aug 2017 18:22:19 +0200 Message-Id: <20170808162224.32419-15-quintela@redhat.com> In-Reply-To: <20170808162224.32419-1-quintela@redhat.com> References: <20170808162224.32419-1-quintela@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.14 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.30]); Tue, 08 Aug 2017 16:25:35 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH v6 14/19] migration: Send the fd number which we are going to use for this page X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: lvivier@redhat.com, dgilbert@redhat.com, peterx@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" We are still sending the page through the main channel, that would change later in the series Signed-off-by: Juan Quintela --- migration/ram.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/migration/ram.c b/migration/ram.c index 7310da9..169cfc9 100644 --- a/migration/ram.c +++ b/migration/ram.c @@ -568,7 +568,7 @@ static uint16_t multifd_send_page(uint8_t *address, boo= l last_page) qemu_mutex_unlock(&p->mutex); qemu_sem_post(&p->sem); =20 - return 0; + return i; } =20 struct MultiFDRecvParams { @@ -1145,6 +1145,7 @@ static int ram_multifd_page(RAMState *rs, PageSearchS= tatus *pss, bool last_stage) { int pages; + uint16_t fd_num; uint8_t *p; RAMBlock *block =3D pss->block; ram_addr_t offset =3D pss->page << TARGET_PAGE_BITS; @@ -1156,8 +1157,10 @@ static int ram_multifd_page(RAMState *rs, PageSearch= Status *pss, ram_counters.transferred +=3D save_page_header(rs, rs->f, block, offset | RAM_SAVE_FLAG_MULTIFD_PAGE); + fd_num =3D multifd_send_page(p, rs->migration_dirty_pages =3D=3D 1= ); + qemu_put_be16(rs->f, fd_num); + ram_counters.transferred +=3D 2; /* size of fd_num */ qemu_put_buffer(rs->f, p, TARGET_PAGE_SIZE); - multifd_send_page(p, rs->migration_dirty_pages =3D=3D 1); ram_counters.transferred +=3D TARGET_PAGE_SIZE; pages =3D 1; ram_counters.normal++; @@ -2907,6 +2910,7 @@ static int ram_load(QEMUFile *f, void *opaque, int ve= rsion_id) while (!postcopy_running && !ret && !(flags & RAM_SAVE_FLAG_EOS)) { ram_addr_t addr, total_ram_bytes; void *host =3D NULL; + uint16_t fd_num; uint8_t ch; =20 addr =3D qemu_get_be64(f); @@ -3017,6 +3021,11 @@ static int ram_load(QEMUFile *f, void *opaque, int v= ersion_id) break; =20 case RAM_SAVE_FLAG_MULTIFD_PAGE: + fd_num =3D qemu_get_be16(f); + if (fd_num !=3D 0) { + /* this is yet an unused variable, changed later */ + fd_num =3D fd_num; + } qemu_get_buffer(f, host, TARGET_PAGE_SIZE); break; =20 --=20 2.9.4 From nobody Fri May 3 10:49:03 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1502209978699588.2436606553813; Tue, 8 Aug 2017 09:32:58 -0700 (PDT) Received: from localhost ([::1]:43589 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1df7RB-0006lZ-Ew for importer@patchew.org; Tue, 08 Aug 2017 12:32:57 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:59155) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1df7KP-0000x8-JX for qemu-devel@nongnu.org; Tue, 08 Aug 2017 12:25:59 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1df7KN-0007DS-Qf for qemu-devel@nongnu.org; Tue, 08 Aug 2017 12:25:57 -0400 Received: from mx1.redhat.com ([209.132.183.28]:52042) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1df7KN-0007D6-Hx for qemu-devel@nongnu.org; Tue, 08 Aug 2017 12:25:55 -0400 Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.phx2.redhat.com [10.5.11.14]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 298486E810 for ; Tue, 8 Aug 2017 16:25:54 +0000 (UTC) Received: from secure.mitica (ovpn-117-165.ams2.redhat.com [10.36.117.165]) by smtp.corp.redhat.com (Postfix) with ESMTP id 675615DD65; Tue, 8 Aug 2017 16:25:35 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 298486E810 Authentication-Results: ext-mx02.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx02.extmail.prod.ext.phx2.redhat.com; spf=fail smtp.mailfrom=quintela@redhat.com From: Juan Quintela To: qemu-devel@nongnu.org Date: Tue, 8 Aug 2017 18:22:20 +0200 Message-Id: <20170808162224.32419-16-quintela@redhat.com> In-Reply-To: <20170808162224.32419-1-quintela@redhat.com> References: <20170808162224.32419-1-quintela@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.14 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.26]); Tue, 08 Aug 2017 16:25:54 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH v6 15/19] migration: Create thread infrastructure for multifd recv side X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: lvivier@redhat.com, dgilbert@redhat.com, peterx@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" We make the locking and the transfer of information specific, even if we are still receiving things through the main thread. Signed-off-by: Juan Quintela -- We split when we create the main channel and where we start the main migration thread, so we wait for the creation of the other threads. Use multifd_clear_group(). --- migration/migration.c | 7 ++++--- migration/migration.h | 1 + migration/ram.c | 55 +++++++++++++++++++++++++++++++++++++++++++++++= ---- migration/socket.c | 2 +- 4 files changed, 57 insertions(+), 8 deletions(-) diff --git a/migration/migration.c b/migration/migration.c index 8e9505a..b78dffc 100644 --- a/migration/migration.c +++ b/migration/migration.c @@ -381,7 +381,7 @@ static void migration_incoming_setup(QEMUFile *f) qemu_file_set_blocking(f, false); } =20 -static void migration_incoming_process(void) +void migration_incoming_process(void) { Coroutine *co =3D qemu_coroutine_create(process_incoming_migration_co,= NULL); qemu_coroutine_enter(co); @@ -400,9 +400,10 @@ void migration_ioc_process_incoming(QIOChannel *ioc) if (!mis->from_src_file) { QEMUFile *f =3D qemu_fopen_channel_input(ioc); mis->from_src_file =3D f; - migration_fd_process_incoming(f); + migration_incoming_setup(f); + return; } - /* We still only have a single channel. Nothing to do here yet */ + multifd_new_channel(ioc); } =20 /** diff --git a/migration/migration.h b/migration/migration.h index ddf8c89..1442b33 100644 --- a/migration/migration.h +++ b/migration/migration.h @@ -154,6 +154,7 @@ void migrate_set_state(int *state, int old_state, int n= ew_state); =20 void migration_fd_process_incoming(QEMUFile *f); void migration_ioc_process_incoming(QIOChannel *ioc); +void migration_incoming_process(void); =20 bool migration_has_all_channels(void); =20 diff --git a/migration/ram.c b/migration/ram.c index 169cfc9..eb0015e 100644 --- a/migration/ram.c +++ b/migration/ram.c @@ -572,12 +572,17 @@ static uint16_t multifd_send_page(uint8_t *address, b= ool last_page) } =20 struct MultiFDRecvParams { + /* not changed */ uint8_t id; QemuThread thread; QIOChannel *c; + QemuSemaphore ready; QemuSemaphore sem; QemuMutex mutex; + /* proteced by param mutex */ bool quit; + multifd_pages_t pages; + bool done; }; typedef struct MultiFDRecvParams MultiFDRecvParams; =20 @@ -587,6 +592,7 @@ struct { int count; /* Should we finish */ bool quit; + multifd_pages_t pages; } *multifd_recv_state; =20 static void terminate_multifd_recv_threads(void) @@ -602,6 +608,7 @@ static void terminate_multifd_recv_threads(void) p->quit =3D true; qemu_sem_post(&p->sem); qemu_mutex_unlock(&p->mutex); + multifd_clear_group(&p->pages); } } =20 @@ -625,6 +632,7 @@ void multifd_load_cleanup(void) } g_free(multifd_recv_state->params); multifd_recv_state->params =3D NULL; + multifd_clear_group(&multifd_recv_state->pages); g_free(multifd_recv_state); multifd_recv_state =3D NULL; } @@ -633,12 +641,20 @@ static void *multifd_recv_thread(void *opaque) { MultiFDRecvParams *p =3D opaque; =20 + qemu_sem_post(&p->ready); while (true) { qemu_mutex_lock(&p->mutex); if (p->quit) { qemu_mutex_unlock(&p->mutex); break; } + if (p->pages.num) { + p->pages.num =3D 0; + p->done =3D true; + qemu_mutex_unlock(&p->mutex); + qemu_sem_post(&p->ready); + continue; + } qemu_mutex_unlock(&p->mutex); qemu_sem_wait(&p->sem); } @@ -682,8 +698,11 @@ void multifd_new_channel(QIOChannel *ioc) } qemu_mutex_init(&p->mutex); qemu_sem_init(&p->sem, 0); + qemu_sem_init(&p->ready, 0); p->quit =3D false; p->id =3D id; + p->done =3D false; + multifd_init_group(&p->pages); p->c =3D ioc; atomic_set(&multifd_recv_state->params[id], p); multifd_recv_state->count++; @@ -703,6 +722,7 @@ int multifd_load_setup(void) multifd_recv_state->params =3D g_new0(MultiFDRecvParams *, thread_coun= t); multifd_recv_state->count =3D 0; multifd_recv_state->quit =3D false; + multifd_init_group(&multifd_recv_state->pages); return 0; } =20 @@ -711,6 +731,36 @@ int multifd_created_threads(void) return multifd_recv_state->count; } =20 +static void multifd_recv_page(uint8_t *address, uint16_t fd_num) +{ + int thread_count; + MultiFDRecvParams *p; + multifd_pages_t *pages =3D &multifd_recv_state->pages; + + pages->iov[pages->num].iov_base =3D address; + pages->iov[pages->num].iov_len =3D TARGET_PAGE_SIZE; + pages->num++; + + if (fd_num =3D=3D MULTIFD_CONTINUE) { + return; + } + + thread_count =3D migrate_multifd_threads(); + assert(fd_num < thread_count); + p =3D multifd_recv_state->params[fd_num]; + + qemu_sem_wait(&p->ready); + + qemu_mutex_lock(&p->mutex); + p->done =3D false; + iov_copy(p->pages.iov, pages->num, pages->iov, pages->num, 0, + iov_size(pages->iov, pages->num)); + p->pages.num =3D pages->num; + pages->num =3D 0; + qemu_mutex_unlock(&p->mutex); + qemu_sem_post(&p->sem); +} + /** * save_page_header: write page header to wire * @@ -3022,10 +3072,7 @@ static int ram_load(QEMUFile *f, void *opaque, int v= ersion_id) =20 case RAM_SAVE_FLAG_MULTIFD_PAGE: fd_num =3D qemu_get_be16(f); - if (fd_num !=3D 0) { - /* this is yet an unused variable, changed later */ - fd_num =3D fd_num; - } + multifd_recv_page(host, fd_num); qemu_get_buffer(f, host, TARGET_PAGE_SIZE); break; =20 diff --git a/migration/socket.c b/migration/socket.c index 5dd6f42..3af9f7c 100644 --- a/migration/socket.c +++ b/migration/socket.c @@ -183,12 +183,12 @@ static gboolean socket_accept_incoming_migration(QIOC= hannel *ioc, =20 qio_channel_set_name(QIO_CHANNEL(sioc), "migration-socket-incoming"); migration_channel_process_incoming(QIO_CHANNEL(sioc)); - object_unref(OBJECT(sioc)); =20 out: if (migration_has_all_channels()) { /* Close listening socket as its no longer needed */ qio_channel_close(ioc, NULL); + migration_incoming_process(); return G_SOURCE_REMOVE; } else { return G_SOURCE_CONTINUE; --=20 2.9.4 From nobody Fri May 3 10:49:03 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1502210357936753.0593572697923; Tue, 8 Aug 2017 09:39:17 -0700 (PDT) Received: from localhost ([::1]:43618 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1df7XI-00049t-AC for importer@patchew.org; Tue, 08 Aug 2017 12:39:16 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:59312) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1df7Kd-000191-7U for qemu-devel@nongnu.org; Tue, 08 Aug 2017 12:26:12 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1df7KZ-0007Ir-6T for qemu-devel@nongnu.org; Tue, 08 Aug 2017 12:26:11 -0400 Received: from mx1.redhat.com ([209.132.183.28]:35326) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1df7KY-0007IM-U2 for qemu-devel@nongnu.org; Tue, 08 Aug 2017 12:26:07 -0400 Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.phx2.redhat.com [10.5.11.14]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id CC9A5356D4 for ; Tue, 8 Aug 2017 16:26:05 +0000 (UTC) Received: from secure.mitica (ovpn-117-165.ams2.redhat.com [10.36.117.165]) by smtp.corp.redhat.com (Postfix) with ESMTP id 6F8544F6D5; Tue, 8 Aug 2017 16:25:54 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com CC9A5356D4 Authentication-Results: ext-mx06.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx06.extmail.prod.ext.phx2.redhat.com; spf=fail smtp.mailfrom=quintela@redhat.com From: Juan Quintela To: qemu-devel@nongnu.org Date: Tue, 8 Aug 2017 18:22:21 +0200 Message-Id: <20170808162224.32419-17-quintela@redhat.com> In-Reply-To: <20170808162224.32419-1-quintela@redhat.com> References: <20170808162224.32419-1-quintela@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.14 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.30]); Tue, 08 Aug 2017 16:26:06 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH v6 16/19] migration: Test new fd infrastructure X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: lvivier@redhat.com, dgilbert@redhat.com, peterx@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" We just send the address through the alternate channels and test that it is ok. Signed-off-by: Juan Quintela --- migration/ram.c | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/migration/ram.c b/migration/ram.c index eb0015e..42ad126 100644 --- a/migration/ram.c +++ b/migration/ram.c @@ -479,8 +479,26 @@ static void *multifd_send_thread(void *opaque) break; } if (p->pages.num) { + int i; + int num; + + num =3D p->pages.num; p->pages.num =3D 0; qemu_mutex_unlock(&p->mutex); + + for (i =3D 0; i < num; i++) { + if (qio_channel_write(p->c, + (const char *)&p->pages.iov[i].iov_b= ase, + sizeof(uint8_t *), &error_abort) + !=3D sizeof(uint8_t *)) { + MigrationState *s =3D migrate_get_current(); + + migrate_set_state(&s->state, MIGRATION_STATUS_ACTIVE, + MIGRATION_STATUS_FAILED); + terminate_multifd_send_threads(); + return NULL; + } + } qemu_mutex_lock(&multifd_send_state->mutex); p->done =3D true; qemu_mutex_unlock(&multifd_send_state->mutex); @@ -640,6 +658,7 @@ void multifd_load_cleanup(void) static void *multifd_recv_thread(void *opaque) { MultiFDRecvParams *p =3D opaque; + uint8_t *recv_address; =20 qemu_sem_post(&p->ready); while (true) { @@ -649,7 +668,38 @@ static void *multifd_recv_thread(void *opaque) break; } if (p->pages.num) { + int i; + int num; + + num =3D p->pages.num; p->pages.num =3D 0; + + for (i =3D 0; i < num; i++) { + if (qio_channel_read(p->c, + (char *)&recv_address, + sizeof(uint8_t *), &error_abort) + !=3D sizeof(uint8_t *)) { + MigrationState *s =3D migrate_get_current(); + + migrate_set_state(&s->state, MIGRATION_STATUS_ACTIVE, + MIGRATION_STATUS_FAILED); + terminate_multifd_recv_threads(); + return NULL; + } + if (recv_address !=3D p->pages.iov[i].iov_base) { + MigrationState *s =3D migrate_get_current(); + + printf("We received %p what we were expecting %p (%d)\= n", + recv_address, + p->pages.iov[i].iov_base, i); + + migrate_set_state(&s->state, MIGRATION_STATUS_ACTIVE, + MIGRATION_STATUS_FAILED); + terminate_multifd_recv_threads(); + return NULL; + } + } + p->done =3D true; qemu_mutex_unlock(&p->mutex); qemu_sem_post(&p->ready); --=20 2.9.4 From nobody Fri May 3 10:49:03 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1502210141667456.2541369769084; Tue, 8 Aug 2017 09:35:41 -0700 (PDT) Received: from localhost ([::1]:43604 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1df7To-0000lg-8R for importer@patchew.org; Tue, 08 Aug 2017 12:35:40 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:59313) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1df7Kd-000192-7i for qemu-devel@nongnu.org; Tue, 08 Aug 2017 12:26:12 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1df7Kb-0007Jv-1k for qemu-devel@nongnu.org; Tue, 08 Aug 2017 12:26:11 -0400 Received: from mx1.redhat.com ([209.132.183.28]:57592) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1df7Ka-0007JW-Rt for qemu-devel@nongnu.org; Tue, 08 Aug 2017 12:26:08 -0400 Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.phx2.redhat.com [10.5.11.14]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id D1C74C050306 for ; Tue, 8 Aug 2017 16:26:07 +0000 (UTC) Received: from secure.mitica (ovpn-117-165.ams2.redhat.com [10.36.117.165]) by smtp.corp.redhat.com (Postfix) with ESMTP id 0FBE817DBE; Tue, 8 Aug 2017 16:26:05 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com D1C74C050306 Authentication-Results: ext-mx08.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx08.extmail.prod.ext.phx2.redhat.com; spf=fail smtp.mailfrom=quintela@redhat.com From: Juan Quintela To: qemu-devel@nongnu.org Date: Tue, 8 Aug 2017 18:22:22 +0200 Message-Id: <20170808162224.32419-18-quintela@redhat.com> In-Reply-To: <20170808162224.32419-1-quintela@redhat.com> References: <20170808162224.32419-1-quintela@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.14 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.32]); Tue, 08 Aug 2017 16:26:07 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH v6 17/19] migration: Rename initial_bytes X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: lvivier@redhat.com, dgilbert@redhat.com, peterx@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Now it is called qemu_file_bytes that reflects better what it does, and we create qemu_file_bytes_now to not have to call qemu_ftell() twice. Signed-off-by: Juan Quintela --- migration/migration.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/migration/migration.c b/migration/migration.c index b78dffc..974ff92 100644 --- a/migration/migration.c +++ b/migration/migration.c @@ -2044,13 +2044,13 @@ static void *migration_thread(void *opaque) /* Used by the bandwidth calcs, updated later */ int64_t initial_time =3D qemu_clock_get_ms(QEMU_CLOCK_REALTIME); int64_t setup_start =3D qemu_clock_get_ms(QEMU_CLOCK_HOST); - int64_t initial_bytes =3D 0; /* * The final stage happens when the remaining data is smaller than * this threshold; it's calculated from the requested downtime and * measured bandwidth */ int64_t threshold_size =3D 0; + int64_t qemu_file_bytes =3D 0; int64_t start_time =3D initial_time; int64_t end_time; bool old_vm_running =3D false; @@ -2138,8 +2138,9 @@ static void *migration_thread(void *opaque) } current_time =3D qemu_clock_get_ms(QEMU_CLOCK_REALTIME); if (current_time >=3D initial_time + BUFFER_DELAY) { - uint64_t transferred_bytes =3D qemu_ftell(s->to_dst_file) - - initial_bytes; + uint64_t qemu_file_bytes_now =3D qemu_ftell(s->to_dst_file); + uint64_t transferred_bytes =3D + qemu_file_bytes_now - qemu_file_bytes; uint64_t time_spent =3D current_time - initial_time; double bandwidth =3D (double)transferred_bytes / time_spent; threshold_size =3D bandwidth * s->parameters.downtime_limit; @@ -2158,7 +2159,7 @@ static void *migration_thread(void *opaque) =20 qemu_file_reset_rate_limit(s->to_dst_file); initial_time =3D current_time; - initial_bytes =3D qemu_ftell(s->to_dst_file); + qemu_file_bytes =3D qemu_file_bytes_now; } if (qemu_file_rate_limit(s->to_dst_file)) { /* usleep expects microseconds */ --=20 2.9.4 From nobody Fri May 3 10:49:03 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1502210522020826.8005523656967; Tue, 8 Aug 2017 09:42:02 -0700 (PDT) Received: from localhost ([::1]:43631 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1df7Zw-0007fo-4s for importer@patchew.org; Tue, 08 Aug 2017 12:42:00 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:59405) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1df7Kr-0001M2-KW for qemu-devel@nongnu.org; Tue, 08 Aug 2017 12:26:27 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1df7Kq-0007PX-4N for qemu-devel@nongnu.org; Tue, 08 Aug 2017 12:26:25 -0400 Received: from mx1.redhat.com ([209.132.183.28]:40834) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1df7Kp-0007PJ-SH for qemu-devel@nongnu.org; Tue, 08 Aug 2017 12:26:24 -0400 Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.phx2.redhat.com [10.5.11.14]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id CF32DC047B8C for ; Tue, 8 Aug 2017 16:26:22 +0000 (UTC) Received: from secure.mitica (ovpn-117-165.ams2.redhat.com [10.36.117.165]) by smtp.corp.redhat.com (Postfix) with ESMTP id 2EE485D747; Tue, 8 Aug 2017 16:26:08 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com CF32DC047B8C Authentication-Results: ext-mx07.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx07.extmail.prod.ext.phx2.redhat.com; spf=fail smtp.mailfrom=quintela@redhat.com From: Juan Quintela To: qemu-devel@nongnu.org Date: Tue, 8 Aug 2017 18:22:23 +0200 Message-Id: <20170808162224.32419-19-quintela@redhat.com> In-Reply-To: <20170808162224.32419-1-quintela@redhat.com> References: <20170808162224.32419-1-quintela@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.14 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.31]); Tue, 08 Aug 2017 16:26:23 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH v6 18/19] migration: Transfer pages over new channels X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: lvivier@redhat.com, dgilbert@redhat.com, peterx@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" We switch for sending the page number to send real pages. Signed-off-by: Juan Quintela -- Remove the HACK bit, now we have the function that calculates the size of a page exported. --- migration/migration.c | 7 +++++- migration/ram.c | 59 +++++++++++++++++------------------------------= ---- 2 files changed, 25 insertions(+), 41 deletions(-) diff --git a/migration/migration.c b/migration/migration.c index 974ff92..aac3cdc 100644 --- a/migration/migration.c +++ b/migration/migration.c @@ -2051,6 +2051,7 @@ static void *migration_thread(void *opaque) */ int64_t threshold_size =3D 0; int64_t qemu_file_bytes =3D 0; + int64_t multifd_pages =3D 0; int64_t start_time =3D initial_time; int64_t end_time; bool old_vm_running =3D false; @@ -2139,8 +2140,11 @@ static void *migration_thread(void *opaque) current_time =3D qemu_clock_get_ms(QEMU_CLOCK_REALTIME); if (current_time >=3D initial_time + BUFFER_DELAY) { uint64_t qemu_file_bytes_now =3D qemu_ftell(s->to_dst_file); + uint64_t multifd_pages_now =3D ram_counters.multifd; uint64_t transferred_bytes =3D - qemu_file_bytes_now - qemu_file_bytes; + (qemu_file_bytes_now - qemu_file_bytes) + + (multifd_pages_now - multifd_pages) * + qemu_target_page_size(); uint64_t time_spent =3D current_time - initial_time; double bandwidth =3D (double)transferred_bytes / time_spent; threshold_size =3D bandwidth * s->parameters.downtime_limit; @@ -2160,6 +2164,7 @@ static void *migration_thread(void *opaque) qemu_file_reset_rate_limit(s->to_dst_file); initial_time =3D current_time; qemu_file_bytes =3D qemu_file_bytes_now; + multifd_pages =3D multifd_pages_now; } if (qemu_file_rate_limit(s->to_dst_file)) { /* usleep expects microseconds */ diff --git a/migration/ram.c b/migration/ram.c index 42ad126..f337360 100644 --- a/migration/ram.c +++ b/migration/ram.c @@ -479,25 +479,21 @@ static void *multifd_send_thread(void *opaque) break; } if (p->pages.num) { - int i; int num; =20 num =3D p->pages.num; p->pages.num =3D 0; qemu_mutex_unlock(&p->mutex); =20 - for (i =3D 0; i < num; i++) { - if (qio_channel_write(p->c, - (const char *)&p->pages.iov[i].iov_b= ase, - sizeof(uint8_t *), &error_abort) - !=3D sizeof(uint8_t *)) { - MigrationState *s =3D migrate_get_current(); + if (qio_channel_writev_all(p->c, p->pages.iov, + num, &error_abort) + !=3D num * TARGET_PAGE_SIZE) { + MigrationState *s =3D migrate_get_current(); =20 - migrate_set_state(&s->state, MIGRATION_STATUS_ACTIVE, - MIGRATION_STATUS_FAILED); - terminate_multifd_send_threads(); - return NULL; - } + migrate_set_state(&s->state, MIGRATION_STATUS_ACTIVE, + MIGRATION_STATUS_FAILED); + terminate_multifd_send_threads(); + return NULL; } qemu_mutex_lock(&multifd_send_state->mutex); p->done =3D true; @@ -658,7 +654,6 @@ void multifd_load_cleanup(void) static void *multifd_recv_thread(void *opaque) { MultiFDRecvParams *p =3D opaque; - uint8_t *recv_address; =20 qemu_sem_post(&p->ready); while (true) { @@ -668,38 +663,21 @@ static void *multifd_recv_thread(void *opaque) break; } if (p->pages.num) { - int i; int num; =20 num =3D p->pages.num; p->pages.num =3D 0; =20 - for (i =3D 0; i < num; i++) { - if (qio_channel_read(p->c, - (char *)&recv_address, - sizeof(uint8_t *), &error_abort) - !=3D sizeof(uint8_t *)) { - MigrationState *s =3D migrate_get_current(); + if (qio_channel_readv_all(p->c, p->pages.iov, + num, &error_abort) + !=3D num * TARGET_PAGE_SIZE) { + MigrationState *s =3D migrate_get_current(); =20 - migrate_set_state(&s->state, MIGRATION_STATUS_ACTIVE, - MIGRATION_STATUS_FAILED); - terminate_multifd_recv_threads(); - return NULL; - } - if (recv_address !=3D p->pages.iov[i].iov_base) { - MigrationState *s =3D migrate_get_current(); - - printf("We received %p what we were expecting %p (%d)\= n", - recv_address, - p->pages.iov[i].iov_base, i); - - migrate_set_state(&s->state, MIGRATION_STATUS_ACTIVE, - MIGRATION_STATUS_FAILED); - terminate_multifd_recv_threads(); - return NULL; - } + migrate_set_state(&s->state, MIGRATION_STATUS_ACTIVE, + MIGRATION_STATUS_FAILED); + terminate_multifd_recv_threads(); + return NULL; } - p->done =3D true; qemu_mutex_unlock(&p->mutex); qemu_sem_post(&p->ready); @@ -1259,8 +1237,10 @@ static int ram_multifd_page(RAMState *rs, PageSearch= Status *pss, offset | RAM_SAVE_FLAG_MULTIFD_PAGE); fd_num =3D multifd_send_page(p, rs->migration_dirty_pages =3D=3D 1= ); qemu_put_be16(rs->f, fd_num); + if (fd_num !=3D MULTIFD_CONTINUE) { + qemu_fflush(rs->f); + } ram_counters.transferred +=3D 2; /* size of fd_num */ - qemu_put_buffer(rs->f, p, TARGET_PAGE_SIZE); ram_counters.transferred +=3D TARGET_PAGE_SIZE; pages =3D 1; ram_counters.normal++; @@ -3123,7 +3103,6 @@ static int ram_load(QEMUFile *f, void *opaque, int ve= rsion_id) case RAM_SAVE_FLAG_MULTIFD_PAGE: fd_num =3D qemu_get_be16(f); multifd_recv_page(host, fd_num); - qemu_get_buffer(f, host, TARGET_PAGE_SIZE); break; =20 case RAM_SAVE_FLAG_EOS: --=20 2.9.4 From nobody Fri May 3 10:49:03 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 150221067596962.66027193662137; Tue, 8 Aug 2017 09:44:35 -0700 (PDT) Received: from localhost ([::1]:43641 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1df7cQ-0002ej-M9 for importer@patchew.org; Tue, 08 Aug 2017 12:44:34 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:59428) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1df7Kx-0001RF-Id for qemu-devel@nongnu.org; Tue, 08 Aug 2017 12:26:35 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1df7Kw-0007ST-4I for qemu-devel@nongnu.org; Tue, 08 Aug 2017 12:26:31 -0400 Received: from mx1.redhat.com ([209.132.183.28]:38264) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1df7Kv-0007S9-RU for qemu-devel@nongnu.org; Tue, 08 Aug 2017 12:26:30 -0400 Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.phx2.redhat.com [10.5.11.14]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id DE11A267C2 for ; Tue, 8 Aug 2017 16:26:28 +0000 (UTC) Received: from secure.mitica (ovpn-117-165.ams2.redhat.com [10.36.117.165]) by smtp.corp.redhat.com (Postfix) with ESMTP id 33A435F92C; Tue, 8 Aug 2017 16:26:22 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com DE11A267C2 Authentication-Results: ext-mx06.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx06.extmail.prod.ext.phx2.redhat.com; spf=fail smtp.mailfrom=quintela@redhat.com From: Juan Quintela To: qemu-devel@nongnu.org Date: Tue, 8 Aug 2017 18:22:24 +0200 Message-Id: <20170808162224.32419-20-quintela@redhat.com> In-Reply-To: <20170808162224.32419-1-quintela@redhat.com> References: <20170808162224.32419-1-quintela@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.14 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.30]); Tue, 08 Aug 2017 16:26:29 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH v6 19/19] migration: Flush receive queue X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: lvivier@redhat.com, dgilbert@redhat.com, peterx@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Each time that we sync the bitmap, it is a possiblity that we receive a page that is being processed by a different thread. We fix this problem just making sure that we wait for all receiving threads to finish its work before we procedeed with the next stage. We are low on page flags, so we use a combination that is not valid to emit that message: MULTIFD_PAGE and COMPRESSED. I tried to make a migration command for it, but it don't work because we sync the bitmap sometimes when we have already sent the beggining of the section, so I just added a new page flag. Signed-off-by: Juan Quintela -- Create RAM_SAVE_FLAG_MULTIFD_SYNC (dave suggestion) Move the set of need_flush to inside the bitmap_sync code (peter suggestion) --- migration/ram.c | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) diff --git a/migration/ram.c b/migration/ram.c index f337360..ee08fd2 100644 --- a/migration/ram.c +++ b/migration/ram.c @@ -71,6 +71,13 @@ #define RAM_SAVE_FLAG_COMPRESS_PAGE 0x100 #define RAM_SAVE_FLAG_MULTIFD_PAGE 0x200 =20 +/* We are getting low on pages flags, so we start using combinations + When we need to flush a page, we sent it as + RAM_SAVE_FLAG_MULTIFD_PAGE | RAM_SAVE_FLAG_COMPRESS_PAGE + We don't allow that combination +*/ +#define RAM_SAVE_FLAG_MULTIFD_SYNC (RAM_SAVE_FLAG_MULTIFD_PAGE | RAM_SAVE_= FLAG_ZERO) + static inline bool is_zero_range(uint8_t *p, uint64_t size) { return buffer_is_zero(p, size); @@ -193,6 +200,9 @@ struct RAMState { uint64_t iterations_prev; /* Iterations since start */ uint64_t iterations; + /* Indicates if we have synced the bitmap and we need to assure that + target has processeed all previous pages */ + bool multifd_needs_flush; /* number of dirty bits in the bitmap */ uint64_t migration_dirty_pages; /* protects modification of the bitmap */ @@ -592,9 +602,11 @@ struct MultiFDRecvParams { QIOChannel *c; QemuSemaphore ready; QemuSemaphore sem; + QemuCond cond_sync; QemuMutex mutex; /* proteced by param mutex */ bool quit; + bool sync; multifd_pages_t pages; bool done; }; @@ -640,6 +652,7 @@ void multifd_load_cleanup(void) qemu_thread_join(&p->thread); qemu_mutex_destroy(&p->mutex); qemu_sem_destroy(&p->sem); + qemu_cond_destroy(&p->cond_sync); socket_recv_channel_destroy(p->c); g_free(p); multifd_recv_state->params[i] =3D NULL; @@ -679,6 +692,10 @@ static void *multifd_recv_thread(void *opaque) return NULL; } p->done =3D true; + if (p->sync) { + qemu_cond_signal(&p->cond_sync); + p->sync =3D false; + } qemu_mutex_unlock(&p->mutex); qemu_sem_post(&p->ready); continue; @@ -727,9 +744,11 @@ void multifd_new_channel(QIOChannel *ioc) qemu_mutex_init(&p->mutex); qemu_sem_init(&p->sem, 0); qemu_sem_init(&p->ready, 0); + qemu_cond_init(&p->cond_sync); p->quit =3D false; p->id =3D id; p->done =3D false; + p->sync =3D false; multifd_init_group(&p->pages); p->c =3D ioc; atomic_set(&multifd_recv_state->params[id], p); @@ -789,6 +808,27 @@ static void multifd_recv_page(uint8_t *address, uint16= _t fd_num) qemu_sem_post(&p->sem); } =20 +static int multifd_flush(void) +{ + int i, thread_count; + + if (!migrate_use_multifd()) { + return 0; + } + thread_count =3D migrate_multifd_threads(); + for (i =3D 0; i < thread_count; i++) { + MultiFDRecvParams *p =3D multifd_recv_state->params[i]; + + qemu_mutex_lock(&p->mutex); + while (!p->done) { + p->sync =3D true; + qemu_cond_wait(&p->cond_sync, &p->mutex); + } + qemu_mutex_unlock(&p->mutex); + } + return 0; +} + /** * save_page_header: write page header to wire * @@ -806,6 +846,12 @@ static size_t save_page_header(RAMState *rs, QEMUFile = *f, RAMBlock *block, { size_t size, len; =20 + if (rs->multifd_needs_flush && + (offset & RAM_SAVE_FLAG_MULTIFD_PAGE)) { + offset |=3D RAM_SAVE_FLAG_ZERO; + rs->multifd_needs_flush =3D false; + } + if (block =3D=3D rs->last_sent_block) { offset |=3D RAM_SAVE_FLAG_CONTINUE; } @@ -1091,6 +1137,9 @@ static void migration_bitmap_sync(RAMState *rs) if (migrate_use_events()) { qapi_event_send_migration_pass(ram_counters.dirty_sync_count, NULL= ); } + if (!rs->ram_bulk_stage && migrate_use_multifd()) { + rs->multifd_needs_flush =3D true; + } } =20 /** @@ -3009,6 +3058,11 @@ static int ram_load(QEMUFile *f, void *opaque, int v= ersion_id) break; } =20 + if ((flags & RAM_SAVE_FLAG_MULTIFD_SYNC) + =3D=3D RAM_SAVE_FLAG_MULTIFD_SYNC) { + multifd_flush(); + flags =3D flags & ~RAM_SAVE_FLAG_ZERO; + } if (flags & (RAM_SAVE_FLAG_ZERO | RAM_SAVE_FLAG_PAGE | RAM_SAVE_FLAG_COMPRESS_PAGE | RAM_SAVE_FLAG_XBZRLE | RAM_SAVE_FLAG_MULTIFD_PAGE)) { --=20 2.9.4