mirror of
https://github.com/xemu-project/xemu.git
synced 2024-11-23 19:49:43 +00:00
migration/dirtyrate: Compare page hash results for recorded sampled page
Compare page hash results for recorded sampled page. Signed-off-by: Chuan Zheng <zhengchuan@huawei.com> Signed-off-by: YanYing Zhuang <ann.zhuangyanying@huawei.com> Reviewed-by: Dr. David Alan Gilbert <dgilbert@redhat.com> Reviewed-by: Li Qiang <liq3ea@gmail.com> Message-Id: <1600237327-33618-8-git-send-email-zhengchuan@huawei.com> Signed-off-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
This commit is contained in:
parent
ba0e519f95
commit
9c04387b88
@ -177,6 +177,69 @@ out:
|
|||||||
return ret;
|
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)
|
static void calculate_dirtyrate(struct DirtyRateConfig config)
|
||||||
{
|
{
|
||||||
/* todo */
|
/* todo */
|
||||||
|
Loading…
Reference in New Issue
Block a user