diff mbox

[v3,43/47] Don't sync dirty bitmaps in postcopy

Message ID 1409238244-31720-44-git-send-email-dgilbert@redhat.com
State New
Headers show

Commit Message

Dr. David Alan Gilbert Aug. 28, 2014, 3:04 p.m. UTC
From: "Dr. David Alan Gilbert" <dgilbert@redhat.com>

Once we're in postcopy the source processors are stopped and memory
shouldn't change any more, so there's no need to look at the dirty
map.

There are two notes to this:
  1) If we do resync and a page had changed then the page would get
     sent again, which the destination wouldn't allow (since it might
     have also modified the page)
  2) Before disabling this I'd seen very rare cases where a page had been
     marked dirtied although the memory contents are apparently identical

Signed-off-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
---
 arch_init.c | 9 +++++++--
 1 file changed, 7 insertions(+), 2 deletions(-)
diff mbox

Patch

diff --git a/arch_init.c b/arch_init.c
index b449f6d..0694394 100644
--- a/arch_init.c
+++ b/arch_init.c
@@ -984,6 +984,7 @@  int64_t ram_mask_postcopy_bitmap(MigrationState *ms)
 {
     int64_t ram_pages = last_ram_offset() >> TARGET_PAGE_BITS;
 
+    /* This should be our last sync, the src is now paused */
     migration_bitmap_sync();
     bitmap_and(ms->sentmap, ms->sentmap, migration_bitmap, ram_pages);
     return ram_pages;
@@ -1251,7 +1252,10 @@  static int ram_save_iterate(QEMUFile *f, void *opaque)
 static int ram_save_complete(QEMUFile *f, void *opaque)
 {
     qemu_mutex_lock_ramlist();
-    migration_bitmap_sync();
+
+    if (!migration_postcopy_phase(migrate_get_current())) {
+        migration_bitmap_sync();
+    }
 
     ram_control_before_iterate(f, RAM_CONTROL_FINISH);
 
@@ -1284,7 +1288,8 @@  static uint64_t ram_save_pending(QEMUFile *f, void *opaque, uint64_t max_size)
 
     remaining_size = ram_save_remaining() * TARGET_PAGE_SIZE;
 
-    if (remaining_size < max_size) {
+    if (!migration_postcopy_phase(migrate_get_current()) &&
+        remaining_size < max_size) {
         qemu_mutex_lock_iothread();
         migration_bitmap_sync();
         qemu_mutex_unlock_iothread();