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> Reviewed-by: David Edmondson <david.edmond...@oracle.com> --- migration/dirtyrate.c | 18 ++++++++++++++++++ migration/dirtyrate.h | 5 +++++ 2 files changed, 23 insertions(+) diff --git a/migration/dirtyrate.c b/migration/dirtyrate.c index f5987d8..ae1959b 100644 --- a/migration/dirtyrate.c +++ b/migration/dirtyrate.c @@ -164,6 +164,18 @@ alloc_ramblock_dirty_info(int *block_index, return block_dinfo; } +static bool skip_sample_ramblock(RAMBlock *block) +{ + /* + * Sample only blocks larger than MIN_RAMBLOCK_SIZE. + */ + if (qemu_ram_get_used_length(block) < (MIN_RAMBLOCK_SIZE << 10)) { + return true; + } + + return false; +} + static int record_ramblock_hash_info(struct RamblockDirtyInfo **block_dinfo, struct DirtyRateConfig config, int *block_index) @@ -174,6 +186,9 @@ static int record_ramblock_hash_info(struct RamblockDirtyInfo **block_dinfo, int index = 0; RAMBLOCK_FOREACH_MIGRATABLE(block) { + if (skip_sample_ramblock(block)) { + continue; + } dinfo = alloc_ramblock_dirty_info(&index, dinfo); if (dinfo == NULL) { return -1; @@ -241,6 +256,9 @@ static int compare_page_hash_info(struct RamblockDirtyInfo *info, RAMBlock *block = NULL; RAMBLOCK_FOREACH_MIGRATABLE(block) { + if (skip_sample_ramblock(block)) { + continue; + } block_dinfo = find_page_matched(block, block_index + 1, info); if (block_dinfo == NULL) { continue; diff --git a/migration/dirtyrate.h b/migration/dirtyrate.h index a3ee305..faaf9da 100644 --- a/migration/dirtyrate.h +++ b/migration/dirtyrate.h @@ -24,6 +24,11 @@ */ #define RAMBLOCK_INFO_MAX_LEN 256 +/* + * Minimum RAMBlock size to sample, in megabytes. + */ +#define MIN_RAMBLOCK_SIZE 128 + struct DirtyRateConfig { uint64_t sample_pages_per_gigabytes; /* sample pages per GB */ int64_t sample_period_seconds; /* time duration between two sampling */ -- 1.8.3.1