summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--migration/block.c5
-rw-r--r--migration/block.h7
-rw-r--r--migration/ram.c6
3 files changed, 17 insertions, 1 deletions
diff --git a/migration/block.c b/migration/block.c
index 9171f60028..606ad4db92 100644
--- a/migration/block.c
+++ b/migration/block.c
@@ -161,6 +161,11 @@ int blk_mig_active(void)
return !QSIMPLEQ_EMPTY(&block_mig_state.bmds_list);
}
+int blk_mig_bulk_active(void)
+{
+ return blk_mig_active() && !block_mig_state.bulk_completed;
+}
+
uint64_t blk_mig_bytes_transferred(void)
{
BlkMigDevState *bmds;
diff --git a/migration/block.h b/migration/block.h
index 22ebe94259..3178609dbd 100644
--- a/migration/block.h
+++ b/migration/block.h
@@ -16,6 +16,7 @@
#ifdef CONFIG_LIVE_BLOCK_MIGRATION
int blk_mig_active(void);
+int blk_mig_bulk_active(void);
uint64_t blk_mig_bytes_transferred(void);
uint64_t blk_mig_bytes_remaining(void);
uint64_t blk_mig_bytes_total(void);
@@ -25,6 +26,12 @@ static inline int blk_mig_active(void)
{
return false;
}
+
+static inline int blk_mig_bulk_active(void)
+{
+ return false;
+}
+
static inline uint64_t blk_mig_bytes_transferred(void)
{
return 0;
diff --git a/migration/ram.c b/migration/ram.c
index 88ca69e7b2..b83f8977c5 100644
--- a/migration/ram.c
+++ b/migration/ram.c
@@ -46,6 +46,7 @@
#include "exec/ram_addr.h"
#include "qemu/rcu_queue.h"
#include "migration/colo.h"
+#include "migration/block.h"
/***********************************************************/
/* ram save/restore */
@@ -825,7 +826,10 @@ static void migration_bitmap_sync(RAMState *rs)
/ (end_time - rs->time_last_bitmap_sync);
bytes_xfer_now = ram_counters.transferred;
- if (migrate_auto_converge()) {
+ /* During block migration the auto-converge logic incorrectly detects
+ * that ram migration makes no progress. Avoid this by disabling the
+ * throttling logic during the bulk phase of block migration. */
+ if (migrate_auto_converge() && !blk_mig_bulk_active()) {
/* The following detection logic can be refined later. For now:
Check to see if the dirtied bytes is 50% more than the approx.
amount of bytes that just got transferred since the last time we