In order to sample real RAM, skip ramblock with size below MIN_RAMBLOCK_SIZE which is set as 128M.
Signed-off-by: Chuan Zheng <zhengch...@huawei.com> --- migration/dirtyrate.c | 24 ++++++++++++++++++++++++ migration/dirtyrate.h | 10 ++++++++++ 2 files changed, 34 insertions(+) diff --git a/migration/dirtyrate.c b/migration/dirtyrate.c index 050270d..bd398b7 100644 --- a/migration/dirtyrate.c +++ b/migration/dirtyrate.c @@ -173,6 +173,24 @@ alloc_ramblock_dirty_info(int *block_index, return block_dinfo; } +static int skip_sample_ramblock(RAMBlock *block) +{ + int64_t ramblock_size; + + /* ramblock size in MB */ + ramblock_size = qemu_ram_get_used_length(block) >> DIRTYRATE_PAGE_SHIFT_MB; + + /* + * Consider ramblock with size larger than 128M is what we + * want to sample. + */ + if (ramblock_size < MIN_RAMBLOCK_SIZE) { + return -1; + } + + return 0; +} + static int record_ramblock_hash_info(struct RamblockDirtyInfo **block_dinfo, struct DirtyRateConfig config, int *block_index) @@ -183,6 +201,9 @@ static int record_ramblock_hash_info(struct RamblockDirtyInfo **block_dinfo, int index = 0; RAMBLOCK_FOREACH_MIGRATABLE(block) { + if (skip_sample_ramblock(block) < 0) { + continue; + } dinfo = alloc_ramblock_dirty_info(&index, dinfo); if (dinfo == NULL) { return -1; @@ -249,6 +270,9 @@ static int compare_page_hash_info(struct RamblockDirtyInfo *info, RAMBlock *block = NULL; RAMBLOCK_FOREACH_MIGRATABLE(block) { + if (skip_sample_ramblock(block) < 0) { + continue; + } block_dinfo = NULL; if (!find_page_matched(block, info, block_index + 1, &block_dinfo)) { continue; diff --git a/migration/dirtyrate.h b/migration/dirtyrate.h index 5050add..41bc264 100644 --- a/migration/dirtyrate.h +++ b/migration/dirtyrate.h @@ -35,10 +35,20 @@ #define DIRTYRATE_PAGE_SHIFT_KB 12 /* + * Sample page size MB shift + */ +#define DIRTYRATE_PAGE_SHIFT_MB 20 + +/* * Sample page size 1G shift */ #define DIRTYRATE_PAGE_SHIFT_GB 30 +/* + * minimum ramblock size to sampled + */ +#define MIN_RAMBLOCK_SIZE 128 + /* Take 1s as default for calculation duration */ #define DEFAULT_FETCH_DIRTYRATE_TIME_SEC 1 -- 1.8.3.1