|
|
eb5a2f |
From 118493a7515526d7adc52b1ca1b667db1458e98c Mon Sep 17 00:00:00 2001
|
|
|
eb5a2f |
From: Dr. David Alan Gilbert (git) <dgilbert@redhat.com>
|
|
|
eb5a2f |
Date: Thu, 8 May 2014 11:27:33 +0200
|
|
|
eb5a2f |
Subject: [PATCH 21/30] Count used RAMBlock pages for migration_dirty_pages
|
|
|
eb5a2f |
|
|
|
eb5a2f |
RH-Author: Dr. David Alan Gilbert (git) <dgilbert@redhat.com>
|
|
|
eb5a2f |
Message-id: <1399548453-9181-2-git-send-email-dgilbert@redhat.com>
|
|
|
eb5a2f |
Patchwork-id: 58746
|
|
|
eb5a2f |
O-Subject: [RHEL7.1/RHEL7.0.z qemu-kvm PATCH 1/1] Count used RAMBlock pages for migration_dirty_pages
|
|
|
eb5a2f |
Bugzilla: 1110189
|
|
|
eb5a2f |
RH-Acked-by: Juan Quintela <quintela@redhat.com>
|
|
|
eb5a2f |
RH-Acked-by: Markus Armbruster <armbru@redhat.com>
|
|
|
eb5a2f |
RH-Acked-by: Amit Shah <amit.shah@redhat.com>
|
|
|
eb5a2f |
|
|
|
eb5a2f |
From: "Dr. David Alan Gilbert" <dgilbert@redhat.com>
|
|
|
eb5a2f |
|
|
|
eb5a2f |
This is a fix for a bug triggered by a migration after hot unplugging
|
|
|
eb5a2f |
a few virtio-net NICs, that caused migration never to converge, because
|
|
|
eb5a2f |
'migration_dirty_pages' is incorrectly initialised.
|
|
|
eb5a2f |
|
|
|
eb5a2f |
'migration_dirty_pages' is used as a tally of the number of outstanding
|
|
|
eb5a2f |
dirty pages, to give the migration code an idea of how much more data
|
|
|
eb5a2f |
will need to be transferred, and thus whether it can end the iterative
|
|
|
eb5a2f |
phase.
|
|
|
eb5a2f |
|
|
|
eb5a2f |
It was initialised to the total size of the RAMBlock address space,
|
|
|
eb5a2f |
however hotunplug can leave this space sparse, and hence
|
|
|
eb5a2f |
migration_dirty_pages ended up too large.
|
|
|
eb5a2f |
|
|
|
eb5a2f |
Signed-off-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
|
|
|
eb5a2f |
|
|
|
eb5a2f |
Signed-off-by: Juan Quintela <quintela@redhat.com>
|
|
|
eb5a2f |
(cherry picked from commit e30d1d8c7195848abb28a8c734a82b845b8b456a)
|
|
|
eb5a2f |
---
|
|
|
eb5a2f |
arch_init.c | 21 +++++++++++++++++----
|
|
|
eb5a2f |
1 file changed, 17 insertions(+), 4 deletions(-)
|
|
|
eb5a2f |
|
|
|
eb5a2f |
Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com>
|
|
|
eb5a2f |
---
|
|
|
eb5a2f |
arch_init.c | 21 +++++++++++++++++----
|
|
|
eb5a2f |
1 files changed, 17 insertions(+), 4 deletions(-)
|
|
|
eb5a2f |
|
|
|
eb5a2f |
diff --git a/arch_init.c b/arch_init.c
|
|
|
eb5a2f |
index 22f7def..b88d686 100644
|
|
|
eb5a2f |
--- a/arch_init.c
|
|
|
eb5a2f |
+++ b/arch_init.c
|
|
|
eb5a2f |
@@ -728,11 +728,8 @@ static void reset_ram_globals(void)
|
|
|
eb5a2f |
static int ram_save_setup(QEMUFile *f, void *opaque)
|
|
|
eb5a2f |
{
|
|
|
eb5a2f |
RAMBlock *block;
|
|
|
eb5a2f |
- int64_t ram_pages = last_ram_offset() >> TARGET_PAGE_BITS;
|
|
|
eb5a2f |
+ int64_t ram_bitmap_pages; /* Size of bitmap in pages, including gaps */
|
|
|
eb5a2f |
|
|
|
eb5a2f |
- migration_bitmap = bitmap_new(ram_pages);
|
|
|
eb5a2f |
- bitmap_set(migration_bitmap, 0, ram_pages);
|
|
|
eb5a2f |
- migration_dirty_pages = ram_pages;
|
|
|
eb5a2f |
mig_throttle_on = false;
|
|
|
eb5a2f |
dirty_rate_high_cnt = 0;
|
|
|
eb5a2f |
|
|
|
eb5a2f |
@@ -771,6 +768,22 @@ static int ram_save_setup(QEMUFile *f, void *opaque)
|
|
|
eb5a2f |
bytes_transferred = 0;
|
|
|
eb5a2f |
reset_ram_globals();
|
|
|
eb5a2f |
|
|
|
eb5a2f |
+ ram_bitmap_pages = last_ram_offset() >> TARGET_PAGE_BITS;
|
|
|
eb5a2f |
+ migration_bitmap = bitmap_new(ram_bitmap_pages);
|
|
|
eb5a2f |
+ bitmap_set(migration_bitmap, 0, ram_bitmap_pages);
|
|
|
eb5a2f |
+
|
|
|
eb5a2f |
+ /*
|
|
|
eb5a2f |
+ * Count the total number of pages used by ram blocks not including any
|
|
|
eb5a2f |
+ * gaps due to alignment or unplugs.
|
|
|
eb5a2f |
+ */
|
|
|
eb5a2f |
+ migration_dirty_pages = 0;
|
|
|
eb5a2f |
+ QTAILQ_FOREACH(block, &ram_list.blocks, next) {
|
|
|
eb5a2f |
+ uint64_t block_pages;
|
|
|
eb5a2f |
+
|
|
|
eb5a2f |
+ block_pages = block->length >> TARGET_PAGE_BITS;
|
|
|
eb5a2f |
+ migration_dirty_pages += block_pages;
|
|
|
eb5a2f |
+ }
|
|
|
eb5a2f |
+
|
|
|
eb5a2f |
memory_global_dirty_log_start();
|
|
|
eb5a2f |
migration_bitmap_sync();
|
|
|
eb5a2f |
qemu_mutex_unlock_iothread();
|
|
|
eb5a2f |
--
|
|
|
eb5a2f |
1.7.1
|
|
|
eb5a2f |
|