From nobody Tue Feb 10 04:29:45 2026 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 1486402686965162.68269462371848; Mon, 6 Feb 2017 09:38:06 -0800 (PST) Received: from localhost ([::1]:49864 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1canEr-0007PD-KO for importer@patchew.org; Mon, 06 Feb 2017 12:38:05 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:45300) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1canA8-0003sU-Lf for qemu-devel@nongnu.org; Mon, 06 Feb 2017 12:33:16 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1canA6-0006O5-RF for qemu-devel@nongnu.org; Mon, 06 Feb 2017 12:33:12 -0500 Received: from mx1.redhat.com ([209.132.183.28]:51078) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1canA6-0006Nt-IE for qemu-devel@nongnu.org; Mon, 06 Feb 2017 12:33:10 -0500 Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id B4A7CC0016A4 for ; Mon, 6 Feb 2017 17:33:10 +0000 (UTC) Received: from dgilbert-t530.redhat.com (ovpn-117-81.ams2.redhat.com [10.36.117.81]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id v16HX8R6012611; Mon, 6 Feb 2017 12:33:09 -0500 From: "Dr. David Alan Gilbert (git)" To: qemu-devel@nongnu.org, quintela@redhat.com Date: Mon, 6 Feb 2017 17:32:51 +0000 Message-Id: <20170206173306.20603-2-dgilbert@redhat.com> In-Reply-To: <20170206173306.20603-1-dgilbert@redhat.com> References: <20170206173306.20603-1-dgilbert@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.27 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.31]); Mon, 06 Feb 2017 17:33:10 +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 v2 01/16] postcopy: Transmit ram size summary word 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: aarcange@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" From: "Dr. David Alan Gilbert" Replace the host page-size in the 'advise' command by a pagesize summary bitmap; if the VM is just using normal RAM then this will be exactly the same as before, however if they're using huge pages they'll be different, and thus: a) Migration from/to old qemu's that don't understand huge pages will fail early. b) Migrations with different size RAMBlocks will also fail early. This catches it very early; earlier than the detailed per-block check in the next patch. Signed-off-by: Dr. David Alan Gilbert Reviewed-by: Laurent Vivier --- include/migration/migration.h | 1 + migration/ram.c | 17 +++++++++++++++++ migration/savevm.c | 32 +++++++++++++++++++++----------- 3 files changed, 39 insertions(+), 11 deletions(-) diff --git a/include/migration/migration.h b/include/migration/migration.h index af9135f..96c9d6e 100644 --- a/include/migration/migration.h +++ b/include/migration/migration.h @@ -366,6 +366,7 @@ void global_state_store_running(void); void flush_page_queue(MigrationState *ms); int ram_save_queue_pages(MigrationState *ms, const char *rbname, ram_addr_t start, ram_addr_t len); +uint64_t ram_pagesize_summary(void); =20 PostcopyState postcopy_state_get(void); /* Set the state and return the old state */ diff --git a/migration/ram.c b/migration/ram.c index ef8fadf..b405e4a 100644 --- a/migration/ram.c +++ b/migration/ram.c @@ -600,6 +600,23 @@ static void migration_bitmap_sync_init(void) iterations_prev =3D 0; } =20 +/* Returns a summary bitmap of the page sizes of all RAMBlocks; + * for VMs with just normal pages this is equivalent to the + * host page size. If it's got some huge pages then it's the OR + * of all the different page sizes. + */ +uint64_t ram_pagesize_summary(void) +{ + RAMBlock *block; + uint64_t summary =3D 0; + + QLIST_FOREACH_RCU(block, &ram_list.blocks, next) { + summary |=3D block->page_size; + } + + return summary; +} + static void migration_bitmap_sync(void) { RAMBlock *block; diff --git a/migration/savevm.c b/migration/savevm.c index de86db0..e83d01a 100644 --- a/migration/savevm.c +++ b/migration/savevm.c @@ -869,7 +869,7 @@ int qemu_savevm_send_packaged(QEMUFile *f, const uint8_= t *buf, size_t len) void qemu_savevm_send_postcopy_advise(QEMUFile *f) { uint64_t tmp[2]; - tmp[0] =3D cpu_to_be64(getpagesize()); + tmp[0] =3D cpu_to_be64(ram_pagesize_summary()); tmp[1] =3D cpu_to_be64(1ul << qemu_target_page_bits()); =20 trace_qemu_savevm_send_postcopy_advise(); @@ -1346,7 +1346,7 @@ static int qemu_loadvm_state_main(QEMUFile *f, Migrat= ionIncomingState *mis); static int loadvm_postcopy_handle_advise(MigrationIncomingState *mis) { PostcopyState ps =3D postcopy_state_set(POSTCOPY_INCOMING_ADVISE); - uint64_t remote_hps, remote_tps; + uint64_t remote_pagesize_summary, local_pagesize_summary, remote_tps; =20 trace_loadvm_postcopy_handle_advise(); if (ps !=3D POSTCOPY_INCOMING_NONE) { @@ -1359,17 +1359,27 @@ static int loadvm_postcopy_handle_advise(MigrationI= ncomingState *mis) return -1; } =20 - remote_hps =3D qemu_get_be64(mis->from_src_file); - if (remote_hps !=3D getpagesize()) { + remote_pagesize_summary =3D qemu_get_be64(mis->from_src_file); + local_pagesize_summary =3D ram_pagesize_summary(); + + if (remote_pagesize_summary !=3D local_pagesize_summary) { /* - * Some combinations of mismatch are probably possible but it gets - * a bit more complicated. In particular we need to place whole - * host pages on the dest at once, and we need to ensure that we - * handle dirtying to make sure we never end up sending part of - * a hostpage on it's own. + * This detects two potential causes of mismatch: + * a) A mismatch in host page sizes + * Some combinations of mismatch are probably possible but it= gets + * a bit more complicated. In particular we need to place wh= ole + * host pages on the dest at once, and we need to ensure that= we + * handle dirtying to make sure we never end up sending part = of + * a hostpage on it's own. + * b) The use of different huge page sizes on source/destination + * a more fine grain test is performed during RAM block migra= tion + * but this test here causes a nice early clear failure, and + * also fails when passed to an older qemu that doesn't + * do huge pages. */ - error_report("Postcopy needs matching host page sizes (s=3D%d d=3D= %d)", - (int)remote_hps, getpagesize()); + error_report("Postcopy needs matching RAM page sizes (s=3D%" PRIx64 + " d=3D%" PRIx= 64 ")", + remote_pagesize_summary, local_pagesize_summary); return -1; } =20 --=20 2.9.3