@@ -24,6 +24,30 @@
#include "qemu/rcu.h"
#include "exec/ramlist.h"
+/* Possible bits for migration_bitmap_sync */
+
+/*
+ * The old-fashioned sync method, which is, in turn, used for CPU
+ * throttle and memory transfer.
+ */
+#define RAMBLOCK_SYN_LEGACY_ITER (1U << 0)
+
+/*
+ * The modern sync method, which is, in turn, used for CPU throttle
+ * and memory transfer.
+ */
+#define RAMBLOCK_SYN_MODERN_ITER (1U << 1)
+
+/* The modern sync method, which is used for CPU throttle only */
+#define RAMBLOCK_SYN_MODERN_PERIOD (1U << 2)
+
+#define RAMBLOCK_SYN_MASK (0x7)
+
+typedef enum RAMBlockSynMode {
+ RAMBLOCK_SYN_LEGACY, /* Old-fashined mode */
+ RAMBLOCK_SYN_MODERN,
+} RAMBlockSynMode;
+
struct RAMBlock {
struct rcu_head rcu;
struct MemoryRegion *mr;
@@ -89,6 +113,27 @@ struct RAMBlock {
* could not have been valid on the source.
*/
ram_addr_t postcopy_length;
+
+ /*
+ * Used to backup the bmap during periodic sync to see whether any dirty
+ * pages were sent during that time.
+ */
+ unsigned long *shadow_bmap;
+
+ /*
+ * The bitmap "bmap," which was initially used for both sync and memory
+ * transfer, will be replaced by two bitmaps: the previously used "bmap"
+ * and the recently added "iter_bmap." Only the memory transfer is
+ * conducted with the previously used "bmap"; the recently added
+ * "iter_bmap" is utilized for sync.
+ */
+ unsigned long *iter_bmap;
+
+ /* Number of new dirty pages during iteration */
+ uint64_t iter_dirty_pages;
+
+ /* If periodic sync has shown up during iteration */
+ bool periodic_sync_shown_up;
};
#endif
#endif
@@ -2362,6 +2362,10 @@ static void ram_bitmaps_destroy(void)
block->bmap = NULL;
g_free(block->file_bmap);
block->file_bmap = NULL;
+ g_free(block->shadow_bmap);
+ block->shadow_bmap = NULL;
+ g_free(block->iter_bmap);
+ block->iter_bmap = NULL;
}
}
@@ -2753,6 +2757,8 @@ static void ram_list_init_bitmaps(void)
}
block->clear_bmap_shift = shift;
block->clear_bmap = bitmap_new(clear_bmap_size(pages, shift));
+ block->shadow_bmap = bitmap_new(pages);
+ block->iter_bmap = bitmap_new(pages);
}
}
}
shadow_bmap, iter_bmap, iter_dirty_pages and periodic_sync_shown_up are introduced to satisfy the need for periodic CPU throttle. Meanwhile, introduce enumeration of dirty bitmap sync method. Signed-off-by: Hyman Huang <yong.huang@smartx.com> --- include/exec/ramblock.h | 45 +++++++++++++++++++++++++++++++++++++++++ migration/ram.c | 6 ++++++ 2 files changed, 51 insertions(+)