From nobody Mon Apr 29 14:11:54 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.zoho.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 1496355109158784.4716773915211; Thu, 1 Jun 2017 15:11:49 -0700 (PDT) Received: from localhost ([::1]:46863 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dGYJm-0000w5-Pm for importer@patchew.org; Thu, 01 Jun 2017 18:11:46 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:47560) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dGYGX-00077C-3M for qemu-devel@nongnu.org; Thu, 01 Jun 2017 18:08:27 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1dGYGW-0002Cf-30 for qemu-devel@nongnu.org; Thu, 01 Jun 2017 18:08:25 -0400 Received: from mx1.redhat.com ([209.132.183.28]:50078) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1dGYGV-0002Bx-Sz for qemu-devel@nongnu.org; Thu, 01 Jun 2017 18:08: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 D5A04C0587C8 for ; Thu, 1 Jun 2017 22:08:22 +0000 (UTC) Received: from secure.mitica (ovpn-117-3.ams2.redhat.com [10.36.117.3]) by smtp.corp.redhat.com (Postfix) with ESMTP id DE4484FA24; Thu, 1 Jun 2017 22:08:20 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com D5A04C0587C8 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=pass smtp.mailfrom=quintela@redhat.com DKIM-Filter: OpenDKIM Filter v2.11.0 mx1.redhat.com D5A04C0587C8 From: Juan Quintela To: qemu-devel@nongnu.org Date: Fri, 2 Jun 2017 00:08:09 +0200 Message-Id: <20170601220813.30535-2-quintela@redhat.com> In-Reply-To: <20170601220813.30535-1-quintela@redhat.com> References: <20170601220813.30535-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]); Thu, 01 Jun 2017 22:08: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 1/5] ram: Call migration_page_queue_free() at ram_migration_cleanup() 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 shouldn't be using memory later than that. Signed-off-by: Juan Quintela Reviewed-by: Dr. David Alan Gilbert Reviewed-by: Peter Xu --- migration/migration.c | 2 -- migration/ram.c | 5 +++-- migration/ram.h | 1 - 3 files changed, 3 insertions(+), 5 deletions(-) diff --git a/migration/migration.c b/migration/migration.c index af4c2cc..ea3d41c 100644 --- a/migration/migration.c +++ b/migration/migration.c @@ -814,8 +814,6 @@ static void migrate_fd_cleanup(void *opaque) qemu_bh_delete(s->cleanup_bh); s->cleanup_bh =3D NULL; =20 - migration_page_queue_free(); - if (s->to_dst_file) { trace_migrate_fd_cleanup(); qemu_mutex_unlock_iothread(); diff --git a/migration/ram.c b/migration/ram.c index db7f4b0..e503277 100644 --- a/migration/ram.c +++ b/migration/ram.c @@ -1181,10 +1181,9 @@ static bool get_queued_page(RAMState *rs, PageSearch= Status *pss) * be some left. in case that there is any page left, we drop it. * */ -void migration_page_queue_free(void) +static void migration_page_queue_free(RAMState *rs) { struct RAMSrcPageRequest *mspr, *next_mspr; - RAMState *rs =3D &ram_state; /* This queue generally should be empty - but in the case of a failed * migration might have some droppings in. */ @@ -1434,6 +1433,7 @@ void free_xbzrle_decoded_buf(void) =20 static void ram_migration_cleanup(void *opaque) { + RAMState *rs =3D opaque; RAMBlock *block; =20 /* caller have hold iothread lock or is in a bh, so there is @@ -1459,6 +1459,7 @@ static void ram_migration_cleanup(void *opaque) XBZRLE.current_buf =3D NULL; } XBZRLE_cache_unlock(); + migration_page_queue_free(rs); } =20 static void ram_state_reset(RAMState *rs) diff --git a/migration/ram.h b/migration/ram.h index c9563d1..d4da419 100644 --- a/migration/ram.h +++ b/migration/ram.h @@ -53,7 +53,6 @@ void migrate_decompress_threads_create(void); void migrate_decompress_threads_join(void); =20 uint64_t ram_pagesize_summary(void); -void migration_page_queue_free(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); void free_xbzrle_decoded_buf(void); --=20 2.9.4 From nobody Mon Apr 29 14:11:54 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.zoho.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 1496355191613135.65633077686653; Thu, 1 Jun 2017 15:13:11 -0700 (PDT) Received: from localhost ([::1]:46870 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dGYL7-0001ry-Mo for importer@patchew.org; Thu, 01 Jun 2017 18:13:09 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:47592) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dGYGZ-00077E-8j for qemu-devel@nongnu.org; Thu, 01 Jun 2017 18:08:30 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1dGYGY-0002Ef-D7 for qemu-devel@nongnu.org; Thu, 01 Jun 2017 18:08:27 -0400 Received: from mx1.redhat.com ([209.132.183.28]:59838) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1dGYGY-0002Dt-6z for qemu-devel@nongnu.org; Thu, 01 Jun 2017 18:08:26 -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 422A263336 for ; Thu, 1 Jun 2017 22:08:25 +0000 (UTC) Received: from secure.mitica (ovpn-117-3.ams2.redhat.com [10.36.117.3]) by smtp.corp.redhat.com (Postfix) with ESMTP id 33A434FA21; Thu, 1 Jun 2017 22:08:23 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 422A263336 Authentication-Results: ext-mx10.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx10.extmail.prod.ext.phx2.redhat.com; spf=pass smtp.mailfrom=quintela@redhat.com DKIM-Filter: OpenDKIM Filter v2.11.0 mx1.redhat.com 422A263336 From: Juan Quintela To: qemu-devel@nongnu.org Date: Fri, 2 Jun 2017 00:08:10 +0200 Message-Id: <20170601220813.30535-3-quintela@redhat.com> In-Reply-To: <20170601220813.30535-1-quintela@redhat.com> References: <20170601220813.30535-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.39]); Thu, 01 Jun 2017 22:08:25 +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 2/5] ram: Move ZERO_TARGET_PAGE inside XBZRLE 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" It was only used by XBZRLE anyways. Signed-off-by: Juan Quintela Reviewed-by: Dr. David Alan Gilbert Reviewed-by: Peter Xu --- migration/ram.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/migration/ram.c b/migration/ram.c index e503277..04b55a7 100644 --- a/migration/ram.c +++ b/migration/ram.c @@ -66,8 +66,6 @@ /* 0x80 is reserved in migration.h start with 0x100 next */ #define RAM_SAVE_FLAG_COMPRESS_PAGE 0x100 =20 -static uint8_t *ZERO_TARGET_PAGE; - static inline bool is_zero_range(uint8_t *p, uint64_t size) { return buffer_is_zero(p, size); @@ -83,6 +81,8 @@ static struct { /* Cache for XBZRLE, Protected by lock. */ PageCache *cache; QemuMutex lock; + /* it will store a page full of zeros */ + uint8_t *zero_target_page; } XBZRLE; =20 /* buffer used for XBZRLE decoding */ @@ -509,7 +509,7 @@ static void xbzrle_cache_zero_page(RAMState *rs, ram_ad= dr_t current_addr) =20 /* We don't care if this fails to allocate a new cache page * as long as it updated an old one */ - cache_insert(XBZRLE.cache, current_addr, ZERO_TARGET_PAGE, + cache_insert(XBZRLE.cache, current_addr, XBZRLE.zero_target_page, rs->bitmap_sync_count); } =20 @@ -1453,10 +1453,11 @@ static void ram_migration_cleanup(void *opaque) cache_fini(XBZRLE.cache); g_free(XBZRLE.encoded_buf); g_free(XBZRLE.current_buf); - g_free(ZERO_TARGET_PAGE); + g_free(XBZRLE.zero_target_page); XBZRLE.cache =3D NULL; XBZRLE.encoded_buf =3D NULL; XBZRLE.current_buf =3D NULL; + XBZRLE.zero_target_page =3D NULL; } XBZRLE_cache_unlock(); migration_page_queue_free(rs); @@ -1877,7 +1878,7 @@ static int ram_state_init(RAMState *rs) =20 if (migrate_use_xbzrle()) { XBZRLE_cache_lock(); - ZERO_TARGET_PAGE =3D g_malloc0(TARGET_PAGE_SIZE); + XBZRLE.zero_target_page =3D g_malloc0(TARGET_PAGE_SIZE); XBZRLE.cache =3D cache_init(migrate_xbzrle_cache_size() / TARGET_PAGE_SIZE, TARGET_PAGE_SIZE); --=20 2.9.4 From nobody Mon Apr 29 14:11:54 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.zoho.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 1496354999149132.27148393856885; Thu, 1 Jun 2017 15:09:59 -0700 (PDT) Received: from localhost ([::1]:46850 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dGYI1-0007yM-MR for importer@patchew.org; Thu, 01 Jun 2017 18:09:57 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:47618) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dGYGb-00077P-9l for qemu-devel@nongnu.org; Thu, 01 Jun 2017 18:08:30 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1dGYGa-0002G2-7U for qemu-devel@nongnu.org; Thu, 01 Jun 2017 18:08:29 -0400 Received: from mx1.redhat.com ([209.132.183.28]:50312) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1dGYGZ-0002FM-Uz for qemu-devel@nongnu.org; Thu, 01 Jun 2017 18:08: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 0BDF880472 for ; Thu, 1 Jun 2017 22:08:27 +0000 (UTC) Received: from secure.mitica (ovpn-117-3.ams2.redhat.com [10.36.117.3]) by smtp.corp.redhat.com (Postfix) with ESMTP id 94CBB4FA21; Thu, 1 Jun 2017 22:08:25 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 0BDF880472 Authentication-Results: ext-mx04.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx04.extmail.prod.ext.phx2.redhat.com; spf=pass smtp.mailfrom=quintela@redhat.com DKIM-Filter: OpenDKIM Filter v2.11.0 mx1.redhat.com 0BDF880472 From: Juan Quintela To: qemu-devel@nongnu.org Date: Fri, 2 Jun 2017 00:08:11 +0200 Message-Id: <20170601220813.30535-4-quintela@redhat.com> In-Reply-To: <20170601220813.30535-1-quintela@redhat.com> References: <20170601220813.30535-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.28]); Thu, 01 Jun 2017 22:08:27 +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 3/5] migration: Print statistics about the number of remaining target pages 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/migration.c | 4 +++- migration/ram.c | 4 ++-- migration/ram.h | 2 +- qapi-schema.json | 6 +++++- 4 files changed, 11 insertions(+), 5 deletions(-) diff --git a/migration/migration.c b/migration/migration.c index ea3d41c..2c13217 100644 --- a/migration/migration.c +++ b/migration/migration.c @@ -518,7 +518,9 @@ static void populate_ram_info(MigrationInfo *info, Migr= ationState *s) } =20 if (s->state !=3D MIGRATION_STATUS_COMPLETED) { - info->ram->remaining =3D ram_bytes_remaining(); + info->ram->remaining_pages =3D ram_pages_remaining(); + info->ram->remaining =3D ram_pages_remaining() * + qemu_target_page_size(); info->ram->dirty_pages_rate =3D ram_dirty_pages_rate(); } } diff --git a/migration/ram.c b/migration/ram.c index 04b55a7..30519e1 100644 --- a/migration/ram.c +++ b/migration/ram.c @@ -265,9 +265,9 @@ uint64_t ram_bytes_transferred(void) return ram_state.bytes_transferred; } =20 -uint64_t ram_bytes_remaining(void) +uint64_t ram_pages_remaining(void) { - return ram_state.migration_dirty_pages * TARGET_PAGE_SIZE; + return ram_state.migration_dirty_pages; } =20 uint64_t ram_dirty_sync_count(void) diff --git a/migration/ram.h b/migration/ram.h index d4da419..5864470 100644 --- a/migration/ram.h +++ b/migration/ram.h @@ -41,7 +41,7 @@ uint64_t xbzrle_mig_pages_cache_miss(void); double xbzrle_mig_cache_miss_rate(void); uint64_t xbzrle_mig_pages_overflow(void); uint64_t ram_bytes_transferred(void); -uint64_t ram_bytes_remaining(void); +uint64_t ram_pages_remaining(void); uint64_t ram_dirty_sync_count(void); uint64_t ram_dirty_pages_rate(void); uint64_t ram_postcopy_requests(void); diff --git a/qapi-schema.json b/qapi-schema.json index 4b50b65..ff1c048 100644 --- a/qapi-schema.json +++ b/qapi-schema.json @@ -601,6 +601,9 @@ # @page-size: The number of bytes per page for the various page-based # statistics (since 2.10) # +# @remaining-pages: amount of pages remaining to be transferred to the tar= get VM +# (since 2.10) +# # Since: 0.14.0 ## { 'struct': 'MigrationStats', @@ -608,7 +611,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', + 'remaining-pages' : 'int' } } =20 ## # @XBZRLECacheStats: --=20 2.9.4 From nobody Mon Apr 29 14:11:54 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.zoho.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 1496355008401537.7255834920016; Thu, 1 Jun 2017 15:10:08 -0700 (PDT) Received: from localhost ([::1]:46851 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dGYI9-00085q-Qg for importer@patchew.org; Thu, 01 Jun 2017 18:10:05 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:47674) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dGYGe-00079N-Kr for qemu-devel@nongnu.org; Thu, 01 Jun 2017 18:08:36 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1dGYGc-0002HI-Bv for qemu-devel@nongnu.org; Thu, 01 Jun 2017 18:08:32 -0400 Received: from mx1.redhat.com ([209.132.183.28]:56622) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1dGYGc-0002Gc-1q for qemu-devel@nongnu.org; Thu, 01 Jun 2017 18:08: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 216B383F42 for ; Thu, 1 Jun 2017 22:08:29 +0000 (UTC) Received: from secure.mitica (ovpn-117-3.ams2.redhat.com [10.36.117.3]) by smtp.corp.redhat.com (Postfix) with ESMTP id 5E25F4FA21; Thu, 1 Jun 2017 22:08:27 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 216B383F42 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=pass smtp.mailfrom=quintela@redhat.com DKIM-Filter: OpenDKIM Filter v2.11.0 mx1.redhat.com 216B383F42 From: Juan Quintela To: qemu-devel@nongnu.org Date: Fri, 2 Jun 2017 00:08:12 +0200 Message-Id: <20170601220813.30535-5-quintela@redhat.com> In-Reply-To: <20170601220813.30535-1-quintela@redhat.com> References: <20170601220813.30535-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]); Thu, 01 Jun 2017 22:08: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 4/5] ram: Use MigrationStats for statistics 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" RAM Statistics need to survive migration to make info migrate work, so we need to store them outside of RAMState. As we already have an struct with those fields, just used them. (MigrationStats and XBZRLECacheStats). Signed-off-by: Juan Quintela Reviewed-by: Dr. David Alan Gilbert Reviewed-by: Peter Xu --- migration/migration.c | 33 +++++----- migration/ram.c | 179 ++++++++++++++--------------------------------= ---- migration/ram.h | 15 +---- 3 files changed, 68 insertions(+), 159 deletions(-) diff --git a/migration/migration.c b/migration/migration.c index 2c13217..331cab7 100644 --- a/migration/migration.c +++ b/migration/migration.c @@ -480,28 +480,28 @@ static void populate_ram_info(MigrationInfo *info, Mi= grationState *s) { info->has_ram =3D true; info->ram =3D g_malloc0(sizeof(*info->ram)); - info->ram->transferred =3D ram_bytes_transferred(); + info->ram->transferred =3D ram_counters.transferred; info->ram->total =3D ram_bytes_total(); - info->ram->duplicate =3D dup_mig_pages_transferred(); + info->ram->duplicate =3D ram_counters.duplicate; /* legacy value. It is not used anymore */ info->ram->skipped =3D 0; - info->ram->normal =3D norm_mig_pages_transferred(); - info->ram->normal_bytes =3D norm_mig_pages_transferred() * + info->ram->normal =3D ram_counters.normal; + info->ram->normal_bytes =3D ram_counters.normal * qemu_target_page_size(); info->ram->mbps =3D s->mbps; - info->ram->dirty_sync_count =3D ram_dirty_sync_count(); - info->ram->postcopy_requests =3D ram_postcopy_requests(); + 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(); =20 if (migrate_use_xbzrle()) { info->has_xbzrle_cache =3D true; info->xbzrle_cache =3D g_malloc0(sizeof(*info->xbzrle_cache)); info->xbzrle_cache->cache_size =3D migrate_xbzrle_cache_size(); - info->xbzrle_cache->bytes =3D xbzrle_mig_bytes_transferred(); - info->xbzrle_cache->pages =3D xbzrle_mig_pages_transferred(); - info->xbzrle_cache->cache_miss =3D xbzrle_mig_pages_cache_miss(); - info->xbzrle_cache->cache_miss_rate =3D xbzrle_mig_cache_miss_rate= (); - info->xbzrle_cache->overflow =3D xbzrle_mig_pages_overflow(); + info->xbzrle_cache->bytes =3D xbzrle_counters.bytes; + info->xbzrle_cache->pages =3D xbzrle_counters.pages; + info->xbzrle_cache->cache_miss =3D xbzrle_counters.cache_miss; + info->xbzrle_cache->cache_miss_rate =3D xbzrle_counters.cache_miss= _rate; + info->xbzrle_cache->overflow =3D xbzrle_counters.overflow; } =20 if (cpu_throttle_active()) { @@ -518,10 +518,11 @@ static void populate_ram_info(MigrationInfo *info, Mi= grationState *s) } =20 if (s->state !=3D MIGRATION_STATUS_COMPLETED) { - info->ram->remaining_pages =3D ram_pages_remaining(); - info->ram->remaining =3D ram_pages_remaining() * + + info->ram->remaining_pages =3D ram_counters.remaining_pages; + info->ram->remaining =3D ram_counters.remaining_pages * qemu_target_page_size(); - info->ram->dirty_pages_rate =3D ram_dirty_pages_rate(); + info->ram->dirty_pages_rate =3D ram_counters.dirty_pages_rate; } } =20 @@ -1886,8 +1887,8 @@ static void *migration_thread(void *opaque) bandwidth, threshold_size); /* if we haven't sent anything, we don't want to recalculate 10000 is a small enough number for our purposes */ - if (ram_dirty_pages_rate() && transferred_bytes > 10000) { - s->expected_downtime =3D ram_dirty_pages_rate() * + if (ram_counters.dirty_pages_rate && transferred_bytes > 10000= ) { + s->expected_downtime =3D ram_counters.dirty_pages_rate * qemu_target_page_size() / bandwidth; } =20 diff --git a/migration/ram.c b/migration/ram.c index 30519e1..6c48219 100644 --- a/migration/ram.c +++ b/migration/ram.c @@ -71,6 +71,8 @@ static inline bool is_zero_range(uint8_t *p, uint64_t siz= e) return buffer_is_zero(p, size); } =20 +XBZRLECacheStats xbzrle_counters; + /* struct contains XBZRLE cache and a static page used by the compression */ static struct { @@ -174,8 +176,6 @@ struct RAMState { bool ram_bulk_stage; /* How many times we have dirty too many pages */ int dirty_rate_high_cnt; - /* How many times we have synchronized the bitmap */ - uint64_t bitmap_sync_count; /* these variables are used for bitmap sync */ /* last time we did a full bitmap_sync */ int64_t time_last_bitmap_sync; @@ -187,32 +187,8 @@ struct RAMState { uint64_t xbzrle_cache_miss_prev; /* number of iterations at the beginning of period */ uint64_t iterations_prev; - /* Accounting fields */ - /* number of zero pages. It used to be pages filled by the same char.= */ - uint64_t zero_pages; - /* number of normal transferred pages */ - uint64_t norm_pages; /* Iterations since start */ uint64_t iterations; - /* xbzrle transmitted bytes. Notice that this is with - * compression, they can't be calculated from the pages */ - uint64_t xbzrle_bytes; - /* xbzrle transmmited pages */ - uint64_t xbzrle_pages; - /* xbzrle number of cache miss */ - uint64_t xbzrle_cache_miss; - /* xbzrle miss rate */ - double xbzrle_cache_miss_rate; - /* xbzrle number of overflows */ - uint64_t xbzrle_overflows; - /* number of dirty bits in the bitmap */ - uint64_t migration_dirty_pages; - /* total number of bytes transferred */ - uint64_t bytes_transferred; - /* number of dirtied pages in the last second */ - uint64_t dirty_pages_rate; - /* Count of requests incoming from destination */ - uint64_t postcopy_requests; /* protects modification of the bitmap */ QemuMutex bitmap_mutex; /* The RAMBlock used in the last src_page_requests */ @@ -225,65 +201,7 @@ typedef struct RAMState RAMState; =20 static RAMState ram_state; =20 -uint64_t dup_mig_pages_transferred(void) -{ - return ram_state.zero_pages; -} - -uint64_t norm_mig_pages_transferred(void) -{ - return ram_state.norm_pages; -} - -uint64_t xbzrle_mig_bytes_transferred(void) -{ - return ram_state.xbzrle_bytes; -} - -uint64_t xbzrle_mig_pages_transferred(void) -{ - return ram_state.xbzrle_pages; -} - -uint64_t xbzrle_mig_pages_cache_miss(void) -{ - return ram_state.xbzrle_cache_miss; -} - -double xbzrle_mig_cache_miss_rate(void) -{ - return ram_state.xbzrle_cache_miss_rate; -} - -uint64_t xbzrle_mig_pages_overflow(void) -{ - return ram_state.xbzrle_overflows; -} - -uint64_t ram_bytes_transferred(void) -{ - return ram_state.bytes_transferred; -} - -uint64_t ram_pages_remaining(void) -{ - return ram_state.migration_dirty_pages; -} - -uint64_t ram_dirty_sync_count(void) -{ - return ram_state.bitmap_sync_count; -} - -uint64_t ram_dirty_pages_rate(void) -{ - return ram_state.dirty_pages_rate; -} - -uint64_t ram_postcopy_requests(void) -{ - return ram_state.postcopy_requests; -} +MigrationStats ram_counters; =20 /* used by the search for pages to send */ struct PageSearchStatus { @@ -510,7 +428,7 @@ static void xbzrle_cache_zero_page(RAMState *rs, ram_ad= dr_t current_addr) /* We don't care if this fails to allocate a new cache page * as long as it updated an old one */ cache_insert(XBZRLE.cache, current_addr, XBZRLE.zero_target_page, - rs->bitmap_sync_count); + ram_counters.dirty_sync_count); } =20 #define ENCODING_FLAG_XBZRLE 0x1 @@ -536,11 +454,12 @@ static int save_xbzrle_page(RAMState *rs, uint8_t **c= urrent_data, int encoded_len =3D 0, bytes_xbzrle; uint8_t *prev_cached_page; =20 - if (!cache_is_cached(XBZRLE.cache, current_addr, rs->bitmap_sync_count= )) { - rs->xbzrle_cache_miss++; + if (!cache_is_cached(XBZRLE.cache, current_addr, + ram_counters.dirty_sync_count)) { + xbzrle_counters.cache_miss++; if (!last_stage) { if (cache_insert(XBZRLE.cache, current_addr, *current_data, - rs->bitmap_sync_count) =3D=3D -1) { + ram_counters.dirty_sync_count) =3D=3D -1) { return -1; } else { /* update *current_data when the page has been @@ -565,7 +484,7 @@ static int save_xbzrle_page(RAMState *rs, uint8_t **cur= rent_data, return 0; } else if (encoded_len =3D=3D -1) { trace_save_xbzrle_page_overflow(); - rs->xbzrle_overflows++; + xbzrle_counters.overflow++; /* update data in the cache */ if (!last_stage) { memcpy(prev_cached_page, *current_data, TARGET_PAGE_SIZE); @@ -586,9 +505,9 @@ static int save_xbzrle_page(RAMState *rs, uint8_t **cur= rent_data, qemu_put_be16(rs->f, encoded_len); qemu_put_buffer(rs->f, XBZRLE.encoded_buf, encoded_len); bytes_xbzrle +=3D encoded_len + 1 + 2; - rs->xbzrle_pages++; - rs->xbzrle_bytes +=3D bytes_xbzrle; - rs->bytes_transferred +=3D bytes_xbzrle; + xbzrle_counters.pages++; + xbzrle_counters.bytes +=3D bytes_xbzrle; + ram_counters.transferred +=3D bytes_xbzrle; =20 return 1; } @@ -630,7 +549,7 @@ static inline bool migration_bitmap_clear_dirty(RAMStat= e *rs, ret =3D test_and_clear_bit(page, rb->bmap); =20 if (ret) { - rs->migration_dirty_pages--; + ram_counters.remaining_pages--; } return ret; } @@ -638,7 +557,7 @@ static inline bool migration_bitmap_clear_dirty(RAMStat= e *rs, static void migration_bitmap_sync_range(RAMState *rs, RAMBlock *rb, ram_addr_t start, ram_addr_t lengt= h) { - rs->migration_dirty_pages +=3D + ram_counters.remaining_pages +=3D cpu_physical_memory_sync_dirty_bitmap(rb, start, length, &rs->num_dirty_pages_period); } @@ -670,7 +589,7 @@ static void migration_bitmap_sync(RAMState *rs) int64_t end_time; uint64_t bytes_xfer_now; =20 - rs->bitmap_sync_count++; + ram_counters.dirty_sync_count++; =20 if (!rs->time_last_bitmap_sync) { rs->time_last_bitmap_sync =3D qemu_clock_get_ms(QEMU_CLOCK_REALTIM= E); @@ -694,9 +613,9 @@ static void migration_bitmap_sync(RAMState *rs) /* more than 1 second =3D 1000 millisecons */ if (end_time > rs->time_last_bitmap_sync + 1000) { /* calculate period counters */ - rs->dirty_pages_rate =3D rs->num_dirty_pages_period * 1000 + ram_counters.dirty_pages_rate =3D rs->num_dirty_pages_period * 1000 / (end_time - rs->time_last_bitmap_sync); - bytes_xfer_now =3D ram_bytes_transferred(); + bytes_xfer_now =3D ram_counters.transferred; =20 if (migrate_auto_converge()) { /* The following detection logic can be refined later. For now: @@ -716,13 +635,13 @@ static void migration_bitmap_sync(RAMState *rs) =20 if (migrate_use_xbzrle()) { if (rs->iterations_prev !=3D rs->iterations) { - rs->xbzrle_cache_miss_rate =3D - (double)(rs->xbzrle_cache_miss - + xbzrle_counters.cache_miss_rate =3D + (double)(xbzrle_counters.cache_miss - rs->xbzrle_cache_miss_prev) / (rs->iterations - rs->iterations_prev); } rs->iterations_prev =3D rs->iterations; - rs->xbzrle_cache_miss_prev =3D rs->xbzrle_cache_miss; + rs->xbzrle_cache_miss_prev =3D xbzrle_counters.cache_miss; } =20 /* reset period counters */ @@ -731,7 +650,7 @@ static void migration_bitmap_sync(RAMState *rs) rs->bytes_xfer_prev =3D bytes_xfer_now; } if (migrate_use_events()) { - qapi_event_send_migration_pass(rs->bitmap_sync_count, NULL); + qapi_event_send_migration_pass(ram_counters.dirty_sync_count, NULL= ); } } =20 @@ -751,11 +670,11 @@ static int save_zero_page(RAMState *rs, RAMBlock *blo= ck, ram_addr_t offset, int pages =3D -1; =20 if (is_zero_range(p, TARGET_PAGE_SIZE)) { - rs->zero_pages++; - rs->bytes_transferred +=3D + ram_counters.duplicate++; + ram_counters.transferred +=3D save_page_header(rs, rs->f, block, offset | RAM_SAVE_FLAG_ZERO= ); qemu_put_byte(rs->f, 0); - rs->bytes_transferred +=3D 1; + ram_counters.transferred +=3D 1; pages =3D 1; } =20 @@ -803,7 +722,7 @@ static int ram_save_page(RAMState *rs, PageSearchStatus= *pss, bool last_stage) ret =3D ram_control_save_page(rs->f, block->offset, offset, TARGET_PAGE_SIZE, &bytes_xmit); if (bytes_xmit) { - rs->bytes_transferred +=3D bytes_xmit; + ram_counters.transferred +=3D bytes_xmit; pages =3D 1; } =20 @@ -814,9 +733,9 @@ static int ram_save_page(RAMState *rs, PageSearchStatus= *pss, bool last_stage) if (ret !=3D RAM_SAVE_CONTROL_NOT_SUPP) { if (ret !=3D RAM_SAVE_CONTROL_DELAYED) { if (bytes_xmit > 0) { - rs->norm_pages++; + ram_counters.normal++; } else if (bytes_xmit =3D=3D 0) { - rs->zero_pages++; + ram_counters.duplicate++; } } } else { @@ -842,8 +761,8 @@ static int ram_save_page(RAMState *rs, PageSearchStatus= *pss, bool last_stage) =20 /* XBZRLE overflow or normal page */ if (pages =3D=3D -1) { - rs->bytes_transferred +=3D save_page_header(rs, rs->f, block, - offset | RAM_SAVE_FLAG_P= AGE); + ram_counters.transferred +=3D + save_page_header(rs, rs->f, block, offset | RAM_SAVE_FLAG_PAGE= ); if (send_async) { qemu_put_buffer_async(rs->f, p, TARGET_PAGE_SIZE, migrate_release_ram() & @@ -851,9 +770,9 @@ static int ram_save_page(RAMState *rs, PageSearchStatus= *pss, bool last_stage) } else { qemu_put_buffer(rs->f, p, TARGET_PAGE_SIZE); } - rs->bytes_transferred +=3D TARGET_PAGE_SIZE; + ram_counters.transferred +=3D TARGET_PAGE_SIZE; pages =3D 1; - rs->norm_pages++; + ram_counters.normal++; } =20 XBZRLE_cache_unlock(); @@ -905,7 +824,7 @@ static void flush_compressed_data(RAMState *rs) qemu_mutex_lock(&comp_param[idx].mutex); if (!comp_param[idx].quit) { len =3D qemu_put_qemu_file(rs->f, comp_param[idx].file); - rs->bytes_transferred +=3D len; + ram_counters.transferred +=3D len; } qemu_mutex_unlock(&comp_param[idx].mutex); } @@ -935,8 +854,8 @@ static int compress_page_with_multi_thread(RAMState *rs= , RAMBlock *block, qemu_cond_signal(&comp_param[idx].cond); qemu_mutex_unlock(&comp_param[idx].mutex); pages =3D 1; - rs->norm_pages++; - rs->bytes_transferred +=3D bytes_xmit; + ram_counters.normal++; + ram_counters.transferred +=3D bytes_xmit; break; } } @@ -976,15 +895,15 @@ static int ram_save_compressed_page(RAMState *rs, Pag= eSearchStatus *pss, ret =3D ram_control_save_page(rs->f, block->offset, offset, TARGET_PAGE_SIZE, &bytes_xmit); if (bytes_xmit) { - rs->bytes_transferred +=3D bytes_xmit; + ram_counters.transferred +=3D bytes_xmit; pages =3D 1; } if (ret !=3D RAM_SAVE_CONTROL_NOT_SUPP) { if (ret !=3D RAM_SAVE_CONTROL_DELAYED) { if (bytes_xmit > 0) { - rs->norm_pages++; + ram_counters.normal++; } else if (bytes_xmit =3D=3D 0) { - rs->zero_pages++; + ram_counters.duplicate++; } } } else { @@ -1004,8 +923,8 @@ static int ram_save_compressed_page(RAMState *rs, Page= SearchStatus *pss, blen =3D qemu_put_compression_data(rs->f, p, TARGET_PAGE_S= IZE, migrate_compress_level()); if (blen > 0) { - rs->bytes_transferred +=3D bytes_xmit + blen; - rs->norm_pages++; + ram_counters.transferred +=3D bytes_xmit + blen; + ram_counters.normal++; pages =3D 1; } else { qemu_file_set_error(rs->f, blen); @@ -1213,7 +1132,7 @@ int ram_save_queue_pages(const char *rbname, ram_addr= _t start, ram_addr_t len) RAMBlock *ramblock; RAMState *rs =3D &ram_state; =20 - rs->postcopy_requests++; + ram_counters.postcopy_requests++; rcu_read_lock(); if (!rbname) { /* Reuse last RAMBlock */ @@ -1401,13 +1320,12 @@ static int ram_find_and_save_block(RAMState *rs, bo= ol last_stage) void acct_update_position(QEMUFile *f, size_t size, bool zero) { uint64_t pages =3D size / TARGET_PAGE_SIZE; - RAMState *rs =3D &ram_state; =20 if (zero) { - rs->zero_pages +=3D pages; + ram_counters.duplicate +=3D pages; } else { - rs->norm_pages +=3D pages; - rs->bytes_transferred +=3D size; + ram_counters.normal +=3D pages; + ram_counters.transferred +=3D size; qemu_update_position(f, size); } } @@ -1631,7 +1549,6 @@ static void postcopy_chunk_hostpages_pass(MigrationSt= ate *ms, bool unsent_pass, RAMBlock *block, PostcopyDiscardState *pds) { - RAMState *rs =3D &ram_state; unsigned long *bitmap =3D block->bmap; unsigned long *unsentmap =3D block->unsentmap; unsigned int host_ratio =3D block->page_size / TARGET_PAGE_SIZE; @@ -1724,7 +1641,7 @@ static void postcopy_chunk_hostpages_pass(MigrationSt= ate *ms, bool unsent_pass, * Remark them as dirty, updating the count for any pages * that weren't previously dirty. */ - rs->migration_dirty_pages +=3D !test_and_set_bit(page, bit= map); + ram_counters.remaining_pages +=3D !test_and_set_bit(page, = bitmap); } } =20 @@ -1932,7 +1849,7 @@ static int ram_state_init(RAMState *rs) * Count the total number of pages used by ram blocks not including any * gaps due to alignment or unplugs. */ - rs->migration_dirty_pages =3D ram_bytes_total() >> TARGET_PAGE_BITS; + ram_counters.remaining_pages =3D ram_bytes_total() >> TARGET_PAGE_BITS; =20 memory_global_dirty_log_start(); migration_bitmap_sync(rs); @@ -2057,7 +1974,7 @@ static int ram_save_iterate(QEMUFile *f, void *opaque) ram_control_after_iterate(f, RAM_CONTROL_ROUND); =20 qemu_put_be64(f, RAM_SAVE_FLAG_EOS); - rs->bytes_transferred +=3D 8; + ram_counters.transferred +=3D 8; =20 ret =3D qemu_file_get_error(f); if (ret < 0) { @@ -2119,7 +2036,7 @@ static void ram_save_pending(QEMUFile *f, void *opaqu= e, uint64_t max_size, RAMState *rs =3D opaque; uint64_t remaining_size; =20 - remaining_size =3D rs->migration_dirty_pages * TARGET_PAGE_SIZE; + remaining_size =3D ram_counters.remaining_pages * TARGET_PAGE_SIZE; =20 if (!migration_in_postcopy() && remaining_size < max_size) { @@ -2128,7 +2045,7 @@ static void ram_save_pending(QEMUFile *f, void *opaqu= e, uint64_t max_size, migration_bitmap_sync(rs); rcu_read_unlock(); qemu_mutex_unlock_iothread(); - remaining_size =3D rs->migration_dirty_pages * TARGET_PAGE_SIZE; + remaining_size =3D ram_counters.remaining_pages * TARGET_PAGE_SIZE; } =20 /* We can do postcopy, and all the data is postcopiable */ diff --git a/migration/ram.h b/migration/ram.h index 5864470..9eadc8c 100644 --- a/migration/ram.h +++ b/migration/ram.h @@ -32,19 +32,10 @@ #include "qemu-common.h" #include "exec/cpu-common.h" =20 +extern MigrationStats ram_counters; +extern XBZRLECacheStats xbzrle_counters; + int64_t xbzrle_cache_resize(int64_t new_size); -uint64_t dup_mig_pages_transferred(void); -uint64_t norm_mig_pages_transferred(void); -uint64_t xbzrle_mig_bytes_transferred(void); -uint64_t xbzrle_mig_pages_transferred(void); -uint64_t xbzrle_mig_pages_cache_miss(void); -double xbzrle_mig_cache_miss_rate(void); -uint64_t xbzrle_mig_pages_overflow(void); -uint64_t ram_bytes_transferred(void); -uint64_t ram_pages_remaining(void); -uint64_t ram_dirty_sync_count(void); -uint64_t ram_dirty_pages_rate(void); -uint64_t ram_postcopy_requests(void); uint64_t ram_bytes_total(void); =20 void migrate_compress_threads_create(void); --=20 2.9.4 From nobody Mon Apr 29 14:11:54 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.zoho.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 149635510836735.78160298338639; Thu, 1 Jun 2017 15:11:48 -0700 (PDT) Received: from localhost ([::1]:46862 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dGYJm-0000w1-RH for importer@patchew.org; Thu, 01 Jun 2017 18:11:46 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:47705) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dGYGh-0007AI-AN for qemu-devel@nongnu.org; Thu, 01 Jun 2017 18:08:36 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1dGYGe-0002Hw-4t for qemu-devel@nongnu.org; Thu, 01 Jun 2017 18:08:35 -0400 Received: from mx1.redhat.com ([209.132.183.28]:56678) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1dGYGd-0002Hf-SD for qemu-devel@nongnu.org; Thu, 01 Jun 2017 18:08:32 -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 E436680F6D for ; Thu, 1 Jun 2017 22:08:30 +0000 (UTC) Received: from secure.mitica (ovpn-117-3.ams2.redhat.com [10.36.117.3]) by smtp.corp.redhat.com (Postfix) with ESMTP id 73AB64FA21; Thu, 1 Jun 2017 22:08:29 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com E436680F6D 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=pass smtp.mailfrom=quintela@redhat.com DKIM-Filter: OpenDKIM Filter v2.11.0 mx1.redhat.com E436680F6D From: Juan Quintela To: qemu-devel@nongnu.org Date: Fri, 2 Jun 2017 00:08:13 +0200 Message-Id: <20170601220813.30535-6-quintela@redhat.com> In-Reply-To: <20170601220813.30535-1-quintela@redhat.com> References: <20170601220813.30535-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]); Thu, 01 Jun 2017 22:08: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 5/5] ram: Make RAMState dynamic 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 the variable while we are at migration and we remove it after migration. Signed-off-by: Juan Quintela Reviewed-by: Dr. David Alan Gilbert --- migration/ram.c | 52 ++++++++++++++++++++++++++++++++-------------------- 1 file changed, 32 insertions(+), 20 deletions(-) diff --git a/migration/ram.c b/migration/ram.c index 6c48219..1164f14 100644 --- a/migration/ram.c +++ b/migration/ram.c @@ -199,7 +199,7 @@ struct RAMState { }; typedef struct RAMState RAMState; =20 -static RAMState ram_state; +static RAMState *ram_state; =20 MigrationStats ram_counters; =20 @@ -783,7 +783,7 @@ static int ram_save_page(RAMState *rs, PageSearchStatus= *pss, bool last_stage) static int do_compress_ram_page(QEMUFile *f, RAMBlock *block, ram_addr_t offset) { - RAMState *rs =3D &ram_state; + RAMState *rs =3D ram_state; int bytes_sent, blen; uint8_t *p =3D block->host + (offset & TARGET_PAGE_MASK); =20 @@ -1130,7 +1130,7 @@ static void migration_page_queue_free(RAMState *rs) int ram_save_queue_pages(const char *rbname, ram_addr_t start, ram_addr_t = len) { RAMBlock *ramblock; - RAMState *rs =3D &ram_state; + RAMState *rs =3D ram_state; =20 ram_counters.postcopy_requests++; rcu_read_lock(); @@ -1351,7 +1351,7 @@ void free_xbzrle_decoded_buf(void) =20 static void ram_migration_cleanup(void *opaque) { - RAMState *rs =3D opaque; + RAMState **rsp =3D opaque; RAMBlock *block; =20 /* caller have hold iothread lock or is in a bh, so there is @@ -1378,7 +1378,9 @@ static void ram_migration_cleanup(void *opaque) XBZRLE.zero_target_page =3D NULL; } XBZRLE_cache_unlock(); - migration_page_queue_free(rs); + migration_page_queue_free(*rsp); + g_free(*rsp); + *rsp =3D NULL; } =20 static void ram_state_reset(RAMState *rs) @@ -1703,7 +1705,7 @@ static int postcopy_chunk_hostpages(MigrationState *m= s, RAMBlock *block) */ int ram_postcopy_send_discard_bitmap(MigrationState *ms) { - RAMState *rs =3D &ram_state; + RAMState *rs =3D ram_state; RAMBlock *block; int ret; =20 @@ -1786,12 +1788,13 @@ err: return ret; } =20 -static int ram_state_init(RAMState *rs) +static int ram_state_init(RAMState **rsp) { - memset(rs, 0, sizeof(*rs)); - qemu_mutex_init(&rs->bitmap_mutex); - qemu_mutex_init(&rs->src_page_req_mutex); - QSIMPLEQ_INIT(&rs->src_page_requests); + *rsp =3D g_new0(RAMState, 1); + + qemu_mutex_init(&(*rsp)->bitmap_mutex); + qemu_mutex_init(&(*rsp)->src_page_req_mutex); + QSIMPLEQ_INIT(&(*rsp)->src_page_requests); =20 if (migrate_use_xbzrle()) { XBZRLE_cache_lock(); @@ -1802,6 +1805,8 @@ static int ram_state_init(RAMState *rs) if (!XBZRLE.cache) { XBZRLE_cache_unlock(); error_report("Error creating cache"); + g_free(*rsp); + *rsp =3D NULL; return -1; } XBZRLE_cache_unlock(); @@ -1810,6 +1815,8 @@ static int ram_state_init(RAMState *rs) XBZRLE.encoded_buf =3D g_try_malloc0(TARGET_PAGE_SIZE); if (!XBZRLE.encoded_buf) { error_report("Error allocating encoded_buf"); + g_free(*rsp); + *rsp =3D NULL; return -1; } =20 @@ -1818,6 +1825,8 @@ static int ram_state_init(RAMState *rs) error_report("Error allocating current_buf"); g_free(XBZRLE.encoded_buf); XBZRLE.encoded_buf =3D NULL; + g_free(*rsp); + *rsp =3D NULL; return -1; } } @@ -1827,7 +1836,7 @@ static int ram_state_init(RAMState *rs) =20 qemu_mutex_lock_ramlist(); rcu_read_lock(); - ram_state_reset(rs); + ram_state_reset(*rsp); =20 /* Skip setting bitmap if there is no RAM */ if (ram_bytes_total()) { @@ -1852,7 +1861,7 @@ static int ram_state_init(RAMState *rs) ram_counters.remaining_pages =3D ram_bytes_total() >> TARGET_PAGE_BITS; =20 memory_global_dirty_log_start(); - migration_bitmap_sync(rs); + migration_bitmap_sync(*rsp); qemu_mutex_unlock_ramlist(); qemu_mutex_unlock_iothread(); rcu_read_unlock(); @@ -1877,16 +1886,16 @@ static int ram_state_init(RAMState *rs) */ static int ram_save_setup(QEMUFile *f, void *opaque) { - RAMState *rs =3D opaque; + RAMState **rsp =3D opaque; RAMBlock *block; =20 /* migration has already setup the bitmap, reuse it. */ if (!migration_in_colo_state()) { - if (ram_state_init(rs) < 0) { + if (ram_state_init(rsp) !=3D 0) { return -1; - } + } } - rs->f =3D f; + (*rsp)->f =3D f; =20 rcu_read_lock(); =20 @@ -1921,7 +1930,8 @@ static int ram_save_setup(QEMUFile *f, void *opaque) */ static int ram_save_iterate(QEMUFile *f, void *opaque) { - RAMState *rs =3D opaque; + RAMState **temp =3D opaque; + RAMState *rs =3D *temp; int ret; int i; int64_t t0; @@ -1996,7 +2006,8 @@ static int ram_save_iterate(QEMUFile *f, void *opaque) */ static int ram_save_complete(QEMUFile *f, void *opaque) { - RAMState *rs =3D opaque; + RAMState **temp =3D opaque; + RAMState *rs =3D *temp; =20 rcu_read_lock(); =20 @@ -2033,7 +2044,8 @@ static void ram_save_pending(QEMUFile *f, void *opaqu= e, uint64_t max_size, uint64_t *non_postcopiable_pending, uint64_t *postcopiable_pending) { - RAMState *rs =3D opaque; + RAMState **temp =3D opaque; + RAMState *rs =3D *temp; uint64_t remaining_size; =20 remaining_size =3D ram_counters.remaining_pages * TARGET_PAGE_SIZE; --=20 2.9.4