diff --git a/migration-dirtyrate-Add-dirtyrate-statistics-series-.patch b/migration-dirtyrate-Add-dirtyrate-statistics-series-.patch new file mode 100644 index 0000000..1d56f80 --- /dev/null +++ b/migration-dirtyrate-Add-dirtyrate-statistics-series-.patch @@ -0,0 +1,93 @@ +From d1340703e127c02e9a586143039507ba10d73cfb Mon Sep 17 00:00:00 2001 +From: Chuan Zheng +Date: Wed, 16 Sep 2020 14:21:59 +0800 +Subject: [PATCH] migration/dirtyrate: Add dirtyrate statistics series + functions + +Add dirtyrate statistics functions to record/update dirtyrate info. + +Signed-off-by: Chuan Zheng +Reviewed-by: Dr. David Alan Gilbert +Reviewed-by: Li Qiang +Message-Id: <1600237327-33618-5-git-send-email-zhengchuan@huawei.com> +Signed-off-by: Dr. David Alan Gilbert +--- + migration/dirtyrate.c | 32 ++++++++++++++++++++++++++++++++ + migration/dirtyrate.h | 12 ++++++++++++ + 2 files changed, 44 insertions(+) + +diff --git a/migration/dirtyrate.c b/migration/dirtyrate.c +index 44a60bf10d..cbb323d6ec 100644 +--- a/migration/dirtyrate.c ++++ b/migration/dirtyrate.c +@@ -23,6 +23,7 @@ + #include "dirtyrate.h" + + static int CalculatingState = DIRTY_RATE_STATUS_UNSTARTED; ++static struct DirtyRateStat DirtyStat; + + static int dirtyrate_set_state(int *state, int old_state, int new_state) + { +@@ -34,6 +35,37 @@ static int dirtyrate_set_state(int *state, int old_state, int new_state) + } + } + ++static void reset_dirtyrate_stat(void) ++{ ++ DirtyStat.total_dirty_samples = 0; ++ DirtyStat.total_sample_count = 0; ++ DirtyStat.total_block_mem_MB = 0; ++ DirtyStat.dirty_rate = -1; ++ DirtyStat.start_time = 0; ++ DirtyStat.calc_time = 0; ++} ++ ++static void update_dirtyrate_stat(struct RamblockDirtyInfo *info) ++{ ++ DirtyStat.total_dirty_samples += info->sample_dirty_count; ++ DirtyStat.total_sample_count += info->sample_pages_count; ++ /* size of total pages in MB */ ++ DirtyStat.total_block_mem_MB += (info->ramblock_pages * ++ TARGET_PAGE_SIZE) >> 20; ++} ++ ++static void update_dirtyrate(uint64_t msec) ++{ ++ uint64_t dirtyrate; ++ uint64_t total_dirty_samples = DirtyStat.total_dirty_samples; ++ uint64_t total_sample_count = DirtyStat.total_sample_count; ++ uint64_t total_block_mem_MB = DirtyStat.total_block_mem_MB; ++ ++ dirtyrate = total_dirty_samples * total_block_mem_MB * ++ 1000 / (total_sample_count * msec); ++ ++ DirtyStat.dirty_rate = dirtyrate; ++} + + static void calculate_dirtyrate(struct DirtyRateConfig config) + { +diff --git a/migration/dirtyrate.h b/migration/dirtyrate.h +index 8707df852d..312debca6f 100644 +--- a/migration/dirtyrate.h ++++ b/migration/dirtyrate.h +@@ -42,5 +42,17 @@ struct RamblockDirtyInfo { + uint32_t *hash_result; /* array of hash result for sampled pages */ + }; + ++/* ++ * Store calculation statistics for each measure. ++ */ ++struct DirtyRateStat { ++ uint64_t total_dirty_samples; /* total dirty sampled page */ ++ uint64_t total_sample_count; /* total sampled pages */ ++ uint64_t total_block_mem_MB; /* size of total sampled pages in MB */ ++ int64_t dirty_rate; /* dirty rate in MB/s */ ++ int64_t start_time; /* calculation start time in units of second */ ++ int64_t calc_time; /* time duration of two sampling in units of second */ ++}; ++ + void *get_dirtyrate_thread(void *arg); + #endif +-- +2.27.0 +