diff --git a/migration-dirtyrate-Compare-page-hash-results-for-re.patch b/migration-dirtyrate-Compare-page-hash-results-for-re.patch new file mode 100644 index 0000000..b9277d5 --- /dev/null +++ b/migration-dirtyrate-Compare-page-hash-results-for-re.patch @@ -0,0 +1,95 @@ +From 949612c5bbc5414970aed7d7ec9390a058ee2246 Mon Sep 17 00:00:00 2001 +From: Chuan Zheng +Date: Wed, 16 Sep 2020 14:22:02 +0800 +Subject: [PATCH] migration/dirtyrate: Compare page hash results for recorded + sampled page + +Compare page hash results for recorded sampled page. + +Signed-off-by: Chuan Zheng +Signed-off-by: YanYing Zhuang +Reviewed-by: Dr. David Alan Gilbert +Reviewed-by: Li Qiang +Message-Id: <1600237327-33618-8-git-send-email-zhengchuan@huawei.com> +Signed-off-by: Dr. David Alan Gilbert +--- + migration/dirtyrate.c | 63 +++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 63 insertions(+) + +diff --git a/migration/dirtyrate.c b/migration/dirtyrate.c +index f93601f8ab..0412f825dc 100644 +--- a/migration/dirtyrate.c ++++ b/migration/dirtyrate.c +@@ -177,6 +177,69 @@ out: + return ret; + } + ++static void calc_page_dirty_rate(struct RamblockDirtyInfo *info) ++{ ++ uint32_t crc; ++ int i; ++ ++ for (i = 0; i < info->sample_pages_count; i++) { ++ crc = get_ramblock_vfn_hash(info, info->sample_page_vfn[i]); ++ if (crc != info->hash_result[i]) { ++ info->sample_dirty_count++; ++ } ++ } ++} ++ ++static struct RamblockDirtyInfo * ++find_block_matched(RAMBlock *block, int count, ++ struct RamblockDirtyInfo *infos) ++{ ++ int i; ++ struct RamblockDirtyInfo *matched; ++ ++ for (i = 0; i < count; i++) { ++ if (!strcmp(infos[i].idstr, qemu_ram_get_idstr(block))) { ++ break; ++ } ++ } ++ ++ if (i == count) { ++ return NULL; ++ } ++ ++ if (infos[i].ramblock_addr != qemu_ram_get_host_addr(block) || ++ infos[i].ramblock_pages != ++ (qemu_ram_get_used_length(block) >> TARGET_PAGE_BITS)) { ++ return NULL; ++ } ++ ++ matched = &infos[i]; ++ ++ return matched; ++} ++ ++static bool compare_page_hash_info(struct RamblockDirtyInfo *info, ++ int block_count) ++{ ++ struct RamblockDirtyInfo *block_dinfo = NULL; ++ RAMBlock *block = NULL; ++ ++ RAMBLOCK_FOREACH_MIGRATABLE(block) { ++ block_dinfo = find_block_matched(block, block_count, info); ++ if (block_dinfo == NULL) { ++ continue; ++ } ++ calc_page_dirty_rate(block_dinfo); ++ update_dirtyrate_stat(block_dinfo); ++ } ++ ++ if (DirtyStat.total_sample_count == 0) { ++ return false; ++ } ++ ++ return true; ++} ++ + static void calculate_dirtyrate(struct DirtyRateConfig config) + { + /* todo */ +-- +2.27.0 +