On Monday, 2020-08-24 at 17:14:35 +08, Chuan Zheng wrote: > Compare page hash results for recorded sampled page. > > Signed-off-by: Chuan Zheng <zhengch...@huawei.com> > Signed-off-by: YanYing Zhuang <ann.zhuangyany...@huawei.com> > --- > migration/dirtyrate.c | 64 > +++++++++++++++++++++++++++++++++++++++++++++++++++ > 1 file changed, 64 insertions(+) > > diff --git a/migration/dirtyrate.c b/migration/dirtyrate.c > index 66de426..050270d 100644 > --- a/migration/dirtyrate.c > +++ b/migration/dirtyrate.c > @@ -202,6 +202,70 @@ static int record_ramblock_hash_info(struct > RamblockDirtyInfo **block_dinfo, > return 0; > } > > +static int calc_page_dirty_rate(struct RamblockDirtyInfo *info)
This never fails - could be void? > +{ > + 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++; > + } > + } > + > + return 0; > +} > + > +static bool find_page_matched(RAMBlock *block, struct RamblockDirtyInfo > *infos, > + int count, struct RamblockDirtyInfo **matched) This might as well just return a struct RamblockDirtyInfo pointer (or NULL). > +{ > + int i; > + > + for (i = 0; i < count; i++) { > + if (!strcmp(infos[i].idstr, qemu_ram_get_idstr(block))) { > + break; > + } > + } > + > + if (i == count) { > + return false; > + } > + > + if (infos[i].ramblock_addr != qemu_ram_get_host_addr(block) || > + infos[i].ramblock_pages != > + (qemu_ram_get_used_length(block) >> DIRTYRATE_PAGE_SHIFT_KB)) { > + return false; > + } > + > + *matched = &infos[i]; > + return true; > +} > + > +static int compare_page_hash_info(struct RamblockDirtyInfo *info, > + int block_index) > +{ > + struct RamblockDirtyInfo *block_dinfo = NULL; > + RAMBlock *block = NULL; > + > + RAMBLOCK_FOREACH_MIGRATABLE(block) { > + block_dinfo = NULL; > + if (!find_page_matched(block, info, block_index + 1, &block_dinfo)) { > + continue; > + } > + if (calc_page_dirty_rate(block_dinfo) < 0) { > + return -1; > + } > + update_dirtyrate_stat(block_dinfo); > + } > + > + if (!DirtyStat.total_sample_count) { > + return -1; > + } > + > + return 0; > +} > + > static void calculate_dirtyrate(struct DirtyRateConfig config) > { > /* todo */ > -- > 1.8.3.1 dme. -- Sometimes these eyes, forget the face they're peering from.