Message ID | 1600137887-58739-8-git-send-email-zhengchuan@huawei.com |
---|---|
State | Superseded |
Headers | show |
Series | *** A Method for evaluating dirty page rate *** | expand |
Chuan Zheng <zhengchuan@huawei.com> 于2020年9月15日周二 上午10:34写道: > > 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> > --- > migration/dirtyrate.c | 63 +++++++++++++++++++++++++++++++++++++++++++++++++++ > 1 file changed, 63 insertions(+) > > diff --git a/migration/dirtyrate.c b/migration/dirtyrate.c > index 5e6eedf..2d48eb8 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_page_matched(RAMBlock *block, int count, > + struct RamblockDirtyInfo *infos) > +{ > + int i; > + struct RamblockDirtyInfo *matched; > + > + for (i = 0; i <= count; i++) { 'i < count'? > + 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_page_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 */ > -- > 1.8.3.1 >
On 2020/9/16 0:30, Li Qiang wrote: > Chuan Zheng <zhengchuan@huawei.com> 于2020年9月15日周二 上午10:34写道: >> >> 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> >> --- >> migration/dirtyrate.c | 63 +++++++++++++++++++++++++++++++++++++++++++++++++++ >> 1 file changed, 63 insertions(+) >> >> diff --git a/migration/dirtyrate.c b/migration/dirtyrate.c >> index 5e6eedf..2d48eb8 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_page_matched(RAMBlock *block, int count, >> + struct RamblockDirtyInfo *infos) >> +{ >> + int i; >> + struct RamblockDirtyInfo *matched; >> + >> + for (i = 0; i <= count; i++) { > > 'i < count'? > Oops, it should be. Will fix it asap. >> + 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_page_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 */ >> -- >> 1.8.3.1 >> > . >
diff --git a/migration/dirtyrate.c b/migration/dirtyrate.c index 5e6eedf..2d48eb8 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_page_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_page_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 */