qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: "Dr. David Alan Gilbert (git)" <dgilbert@redhat.com>
To: qemu-devel@nongnu.org
Cc: quintela@redhat.com, lvivier@redhat.com,
	marcandre.lureau@redhat.com, vsementsov@virtuozzo.com,
	danielhb@linux.vnet.ibm.com, pasic@linux.vnet.ibm.com,
	ashijeetacharya@gmail.com
Subject: [Qemu-devel] [PULL 12/27] postcopy: Transmit ram size summary word
Date: Tue, 28 Feb 2017 12:40:41 +0000	[thread overview]
Message-ID: <20170228124056.5074-13-dgilbert@redhat.com> (raw)
In-Reply-To: <20170228124056.5074-1-dgilbert@redhat.com>

From: "Dr. David Alan Gilbert" <dgilbert@redhat.com>

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 <dgilbert@redhat.com>
Reviewed-by: Laurent Vivier <lvivier@redhat.com>
Reviewed-by: Juan Quintela <quintela@redhat.com>
Message-Id: <20170224182844.32452-2-dgilbert@redhat.com>
Signed-off-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
---
 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 34a383e..6272adf 100644
--- a/include/migration/migration.h
+++ b/include/migration/migration.h
@@ -378,6 +378,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);
 
 PostcopyState postcopy_state_get(void);
 /* Set the state and return the old state */
diff --git a/migration/ram.c b/migration/ram.c
index f289fcd..1f6397a 100644
--- a/migration/ram.c
+++ b/migration/ram.c
@@ -600,6 +600,23 @@ static void migration_bitmap_sync_init(void)
     iterations_prev = 0;
 }
 
+/* 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 = 0;
+
+    QLIST_FOREACH_RCU(block, &ram_list.blocks, next) {
+        summary |= block->page_size;
+    }
+
+    return summary;
+}
+
 static void migration_bitmap_sync(void)
 {
     RAMBlock *block;
diff --git a/migration/savevm.c b/migration/savevm.c
index 26d2c44..3b19a4a 100644
--- a/migration/savevm.c
+++ b/migration/savevm.c
@@ -870,7 +870,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] = cpu_to_be64(getpagesize());
+    tmp[0] = cpu_to_be64(ram_pagesize_summary());
     tmp[1] = cpu_to_be64(1ul << qemu_target_page_bits());
 
     trace_qemu_savevm_send_postcopy_advise();
@@ -1352,7 +1352,7 @@ static int qemu_loadvm_state_main(QEMUFile *f, MigrationIncomingState *mis);
 static int loadvm_postcopy_handle_advise(MigrationIncomingState *mis)
 {
     PostcopyState ps = postcopy_state_set(POSTCOPY_INCOMING_ADVISE);
-    uint64_t remote_hps, remote_tps;
+    uint64_t remote_pagesize_summary, local_pagesize_summary, remote_tps;
 
     trace_loadvm_postcopy_handle_advise();
     if (ps != POSTCOPY_INCOMING_NONE) {
@@ -1365,17 +1365,27 @@ static int loadvm_postcopy_handle_advise(MigrationIncomingState *mis)
         return -1;
     }
 
-    remote_hps = qemu_get_be64(mis->from_src_file);
-    if (remote_hps != getpagesize())  {
+    remote_pagesize_summary = qemu_get_be64(mis->from_src_file);
+    local_pagesize_summary = ram_pagesize_summary();
+
+    if (remote_pagesize_summary != 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 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.
+         *   b) The use of different huge page sizes on source/destination
+         *      a more fine grain test is performed during RAM block migration
+         *      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=%d d=%d)",
-                     (int)remote_hps, getpagesize());
+        error_report("Postcopy needs matching RAM page sizes (s=%" PRIx64
+                                                             " d=%" PRIx64 ")",
+                     remote_pagesize_summary, local_pagesize_summary);
         return -1;
     }
 
-- 
2.9.3

  parent reply	other threads:[~2017-02-28 12:41 UTC|newest]

Thread overview: 31+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-02-28 12:40 [Qemu-devel] [PULL 00/27] migration queue Dr. David Alan Gilbert (git)
2017-02-28 12:40 ` [Qemu-devel] [PULL 01/27] Changing error message of QMP 'migrate_set_downtime' to seconds Dr. David Alan Gilbert (git)
2017-02-28 12:40 ` [Qemu-devel] [PULL 02/27] migration/vmstate: renames in (load|save)_state Dr. David Alan Gilbert (git)
2017-02-28 12:40 ` [Qemu-devel] [PULL 03/27] migration/vmstate: split up vmstate_base_addr Dr. David Alan Gilbert (git)
2017-02-28 12:40 ` [Qemu-devel] [PULL 04/27] migration/vmstate: fix array of ptr with nullptrs Dr. David Alan Gilbert (git)
2017-02-28 12:40 ` [Qemu-devel] [PULL 05/27] tests/test-vmstate.c: test array of ptr with null Dr. David Alan Gilbert (git)
2017-02-28 12:40 ` [Qemu-devel] [PULL 06/27] tests/test-vmstate.c: test array of ptr to primitive Dr. David Alan Gilbert (git)
2017-02-28 12:40 ` [Qemu-devel] [PULL 07/27] vmstate-static-checker: update white list with spapr_pci Dr. David Alan Gilbert (git)
2017-02-28 12:40 ` [Qemu-devel] [PULL 08/27] migrate: Introduce a 'dc->vmsd' check to avoid segfault for --only-migratable Dr. David Alan Gilbert (git)
2017-02-28 12:40 ` [Qemu-devel] [PULL 09/27] migration: fix id leak regression Dr. David Alan Gilbert (git)
2017-02-28 12:40 ` [Qemu-devel] [PULL 10/27] migration: Update docs to discourage version bumps Dr. David Alan Gilbert (git)
2017-02-28 12:40 ` [Qemu-devel] [PULL 11/27] migration: fix use-after-free of to_dst_file Dr. David Alan Gilbert (git)
2017-02-28 12:40 ` Dr. David Alan Gilbert (git) [this message]
2017-02-28 12:40 ` [Qemu-devel] [PULL 13/27] postcopy: Transmit and compare individual page sizes Dr. David Alan Gilbert (git)
2017-02-28 12:40 ` [Qemu-devel] [PULL 14/27] postcopy: Chunk discards for hugepages Dr. David Alan Gilbert (git)
2017-02-28 12:40 ` [Qemu-devel] [PULL 15/27] exec: ram_block_discard_range Dr. David Alan Gilbert (git)
2017-02-28 12:40 ` [Qemu-devel] [PULL 16/27] postcopy: enhance ram_block_discard_range for hugepages Dr. David Alan Gilbert (git)
2017-02-28 12:40 ` [Qemu-devel] [PULL 17/27] postcopy: Record largest page size Dr. David Alan Gilbert (git)
2017-02-28 12:40 ` [Qemu-devel] [PULL 18/27] postcopy: Plumb pagesize down into place helpers Dr. David Alan Gilbert (git)
2017-02-28 12:40 ` [Qemu-devel] [PULL 19/27] postcopy: Use temporary for placing zero huge pages Dr. David Alan Gilbert (git)
2017-02-28 12:40 ` [Qemu-devel] [PULL 20/27] postcopy: Load huge pages in one go Dr. David Alan Gilbert (git)
2017-02-28 12:40 ` [Qemu-devel] [PULL 21/27] postcopy: Mask fault addresses to huge page boundary Dr. David Alan Gilbert (git)
2017-02-28 12:40 ` [Qemu-devel] [PULL 22/27] postcopy: Send whole huge pages Dr. David Alan Gilbert (git)
2017-02-28 12:40 ` [Qemu-devel] [PULL 23/27] postcopy: Allow hugepages Dr. David Alan Gilbert (git)
2017-02-28 12:40 ` [Qemu-devel] [PULL 24/27] postcopy: Update userfaultfd.h header Dr. David Alan Gilbert (git)
2017-02-28 12:40 ` [Qemu-devel] [PULL 25/27] postcopy: Check for userfault+hugepage feature Dr. David Alan Gilbert (git)
2017-02-28 12:40 ` [Qemu-devel] [PULL 26/27] postcopy: Add doc about hugepages and postcopy Dr. David Alan Gilbert (git)
2017-02-28 12:40 ` [Qemu-devel] [PULL 27/27] postcopy: Add extra check for COPY function Dr. David Alan Gilbert (git)
2017-03-01 13:06 ` [Qemu-devel] [PULL 00/27] migration queue Peter Maydell
2017-03-01 13:13   ` Dr. David Alan Gilbert
2017-03-02 19:27 ` Peter Maydell

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20170228124056.5074-13-dgilbert@redhat.com \
    --to=dgilbert@redhat.com \
    --cc=ashijeetacharya@gmail.com \
    --cc=danielhb@linux.vnet.ibm.com \
    --cc=lvivier@redhat.com \
    --cc=marcandre.lureau@redhat.com \
    --cc=pasic@linux.vnet.ibm.com \
    --cc=qemu-devel@nongnu.org \
    --cc=quintela@redhat.com \
    --cc=vsementsov@virtuozzo.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).