From nobody Tue Oct 28 12:15:18 2025 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 151558912268676.79984043693764; Wed, 10 Jan 2018 04:58:42 -0800 (PST) Received: from localhost ([::1]:39178 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eZFxp-0006YM-SA for importer@patchew.org; Wed, 10 Jan 2018 07:58:41 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:40465) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eZFnQ-0006GM-B2 for qemu-devel@nongnu.org; Wed, 10 Jan 2018 07:47:57 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1eZFnP-0004kv-C7 for qemu-devel@nongnu.org; Wed, 10 Jan 2018 07:47:56 -0500 Received: from mx1.redhat.com ([209.132.183.28]:41212) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1eZFnP-0004kC-3A for qemu-devel@nongnu.org; Wed, 10 Jan 2018 07:47:55 -0500 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 38E5849023 for ; Wed, 10 Jan 2018 12:47:54 +0000 (UTC) Received: from secure.mitica (ovpn-116-55.ams2.redhat.com [10.36.116.55]) by smtp.corp.redhat.com (Postfix) with ESMTP id 90CD77B8E1; Wed, 10 Jan 2018 12:47:52 +0000 (UTC) From: Juan Quintela To: qemu-devel@nongnu.org Date: Wed, 10 Jan 2018 13:47:21 +0100 Message-Id: <20180110124723.11879-13-quintela@redhat.com> In-Reply-To: <20180110124723.11879-1-quintela@redhat.com> References: <20180110124723.11879-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]); Wed, 10 Jan 2018 12:47: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 v10 12/14] migration: Sent the page list over the normal thread 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/ram.c | 69 +++++++++++++++++++++++++++++++++++++++++++++++++----= ---- 1 file changed, 60 insertions(+), 9 deletions(-) diff --git a/migration/ram.c b/migration/ram.c index b1ad7b2730..f636c7da0a 100644 --- a/migration/ram.c +++ b/migration/ram.c @@ -411,6 +411,19 @@ static void compress_threads_save_setup(void) /* used to continue on the same multifd group */ #define MULTIFD_CONTINUE UINT16_MAX =20 +#define MULTIFD_MAGIC 0x112233d +#define MULTIFD_VERSION 1 + +typedef struct { + uint32_t magic; + uint32_t version; + uint32_t size; + uint32_t used; + uint32_t seq; + char ramblock[256]; + ram_addr_t offset[]; +} __attribute__((packed)) MultiFDPacket_t; + typedef struct { /* number of used pages */ uint32_t used; @@ -420,6 +433,8 @@ typedef struct { uint32_t seq; struct iovec *iov; RAMBlock *block; + uint32_t packet_len; + MultiFDPacket_t *packet; } multifd_pages_t; =20 struct MultiFDSendParams { @@ -456,6 +471,8 @@ static void multifd_pages_init(multifd_pages_t **ppages= , size_t size) =20 pages->allocated =3D size; pages->iov =3D g_new0(struct iovec, size); + pages->packet_len =3D sizeof(MultiFDPacket_t) + sizeof(ram_addr_t) * s= ize; + pages->packet =3D g_malloc0(pages->packet_len); *ppages =3D pages; } =20 @@ -467,6 +484,9 @@ static void multifd_pages_clear(multifd_pages_t *pages) pages->block =3D NULL; g_free(pages->iov); pages->iov =3D NULL; + pages->packet_len =3D 0; + g_free(pages->packet); + pages->packet =3D NULL; g_free(pages); } =20 @@ -553,16 +573,27 @@ static void *multifd_send_thread(void *opaque) break; } if (p->pages->used) { + MultiFDPacket_t *packet =3D p->pages->packet; Error *local_err =3D NULL; size_t ret; - uint32_t used; =20 - used =3D p->pages->used; + packet->used =3D p->pages->used; p->pages->used =3D 0; qemu_mutex_unlock(&p->mutex); - - trace_multifd_send(p->id, p->pages->seq, used); - ret =3D qio_channel_writev_all(p->c, p->pages->iov, used, &loc= al_err); + packet->magic =3D MULTIFD_MAGIC; + packet->version =3D MULTIFD_VERSION; + strncpy(packet->ramblock, p->pages->block->idstr, 256); + packet->size =3D migrate_multifd_page_count(); + packet->seq =3D p->pages->seq; + ret =3D qio_channel_write_all(p->c, (void *)packet, + p->pages->packet_len, &local_err); + if (ret !=3D 0) { + terminate_multifd_send_threads(local_err); + return NULL; + } + trace_multifd_send(p->id, p->pages->seq, packet->used); + ret =3D qio_channel_writev_all(p->c, p->pages->iov, + packet->used, &local_err); if (ret !=3D 0) { terminate_multifd_send_threads(local_err); return NULL; @@ -645,6 +676,7 @@ static uint16_t multifd_send_page(RAMBlock *block, ram_= addr_t offset, pages->block =3D block; } =20 + pages->packet->offset[pages->used] =3D offset; pages->iov[pages->used].iov_base =3D block->host + offset; pages->iov[pages->used].iov_len =3D TARGET_PAGE_SIZE; pages->used++; @@ -776,16 +808,35 @@ static void *multifd_recv_thread(void *opaque) break; } if (p->pages->used) { + MultiFDPacket_t *packet =3D p->pages->packet; + RAMBlock *block; Error *local_err =3D NULL; size_t ret; - uint32_t used; + int i; =20 - used =3D p->pages->used; p->pages->used =3D 0; qemu_mutex_unlock(&p->mutex); =20 - trace_multifd_recv(p->id, p->pages->seq, used); - ret =3D qio_channel_readv_all(p->c, p->pages->iov, used, &loca= l_err); + ret =3D qio_channel_read_all(p->c, (void *)packet, + p->pages->packet_len, &local_err); + if (ret !=3D 0) { + terminate_multifd_recv_threads(local_err); + return NULL; + } + block =3D qemu_ram_block_by_name(packet->ramblock); + p->pages->seq =3D packet->seq; + for (i =3D 0; i < packet->used; i++) { + if (block->host + packet->offset[i] + !=3D p->pages->iov[i].iov_base) { + printf("page offset %d packet %p pages %p\n", i, + block->host + packet->offset[i], + p->pages->iov[i].iov_base); + break; + } + } + trace_multifd_recv(p->id, p->pages->seq, packet->used); + ret =3D qio_channel_readv_all(p->c, p->pages->iov, + packet->used, &local_err); if (ret !=3D 0) { terminate_multifd_recv_threads(local_err); return NULL; --=20 2.14.3