From 61a7fadc31a6a098e055e133a98d62e53073ac98 Mon Sep 17 00:00:00 2001 From: "Huawei Technologies Co., Ltd" Date: Wed, 16 Sep 2020 14:22:05 +0800 Subject: [PATCH] migration/dirtyrate: Implement calculate_dirtyrate() function Implement calculate_dirtyrate() function. Signed-off-by: Chuan Zheng Signed-off-by: YanYing Zhuang Reviewed-by: Dr. David Alan Gilbert Reviewed-by: Li Qiang Message-Id: <1600237327-33618-11-git-send-email-zhengchuan@huawei.com> Signed-off-by: Dr. David Alan Gilbert --- ...ate-Implement-calculate_dirtyrate-fu.patch | 83 +++++++++++++++++++ 1 file changed, 83 insertions(+) create mode 100644 migration-dirtyrate-Implement-calculate_dirtyrate-fu.patch diff --git a/migration-dirtyrate-Implement-calculate_dirtyrate-fu.patch b/migration-dirtyrate-Implement-calculate_dirtyrate-fu.patch new file mode 100644 index 0000000..1fcb2c0 --- /dev/null +++ b/migration-dirtyrate-Implement-calculate_dirtyrate-fu.patch @@ -0,0 +1,83 @@ +From 18102266fb18c4bfcdd4760e7111ca03a7520588 Mon Sep 17 00:00:00 2001 +From: Chuan Zheng +Date: Wed, 16 Sep 2020 14:22:05 +0800 +Subject: [PATCH] migration/dirtyrate: Implement calculate_dirtyrate() function + +Implement calculate_dirtyrate() function. + +Signed-off-by: Chuan Zheng +Signed-off-by: YanYing Zhuang +Reviewed-by: Dr. David Alan Gilbert +Reviewed-by: Li Qiang +Message-Id: <1600237327-33618-11-git-send-email-zhengchuan@huawei.com> +Signed-off-by: Dr. David Alan Gilbert +--- + migration/dirtyrate.c | 45 +++++++++++++++++++++++++++++++++++++++++-- + 1 file changed, 43 insertions(+), 2 deletions(-) + +diff --git a/migration/dirtyrate.c b/migration/dirtyrate.c +index 485d6467c9..c7a389a527 100644 +--- a/migration/dirtyrate.c ++++ b/migration/dirtyrate.c +@@ -162,6 +162,21 @@ static void get_ramblock_dirty_info(RAMBlock *block, + strcpy(info->idstr, qemu_ram_get_idstr(block)); + } + ++static void free_ramblock_dirty_info(struct RamblockDirtyInfo *infos, int count) ++{ ++ int i; ++ ++ if (!infos) { ++ return; ++ } ++ ++ for (i = 0; i < count; i++) { ++ g_free(infos[i].sample_page_vfn); ++ g_free(infos[i].hash_result); ++ } ++ g_free(infos); ++} ++ + static bool skip_sample_ramblock(RAMBlock *block) + { + /* +@@ -287,8 +302,34 @@ static bool compare_page_hash_info(struct RamblockDirtyInfo *info, + + static void calculate_dirtyrate(struct DirtyRateConfig config) + { +- /* todo */ +- return; ++ struct RamblockDirtyInfo *block_dinfo = NULL; ++ int block_count = 0; ++ int64_t msec = 0; ++ int64_t initial_time; ++ ++ rcu_register_thread(); ++ reset_dirtyrate_stat(); ++ rcu_read_lock(); ++ initial_time = qemu_clock_get_ms(QEMU_CLOCK_REALTIME); ++ if (!record_ramblock_hash_info(&block_dinfo, config, &block_count)) { ++ goto out; ++ } ++ rcu_read_unlock(); ++ ++ msec = config.sample_period_seconds * 1000; ++ msec = set_sample_page_period(msec, initial_time); ++ ++ rcu_read_lock(); ++ if (!compare_page_hash_info(block_dinfo, block_count)) { ++ goto out; ++ } ++ ++ update_dirtyrate(msec); ++ ++out: ++ rcu_read_unlock(); ++ free_ramblock_dirty_info(block_dinfo, block_count); ++ rcu_unregister_thread(); + } + + void *get_dirtyrate_thread(void *arg) +-- +2.27.0 +