From: Zheng Chuan <zhengch...@huawei.com> Add get_dirtyrate_thread() functions
Signed-off-by: Zheng Chuan <zhengch...@huawei.com> Signed-off-by: YanYing Zhang <ann.zhuangyany...@huawei.com> --- migration/dirtyrate.c | 63 +++++++++++++++++++++++++++++++++++++++++++++++++++ migration/dirtyrate.h | 38 +++++++++++++++++++++++++++++++ 2 files changed, 101 insertions(+) create mode 100644 migration/dirtyrate.c create mode 100644 migration/dirtyrate.h diff --git a/migration/dirtyrate.c b/migration/dirtyrate.c new file mode 100644 index 0000000..fc652fb --- /dev/null +++ b/migration/dirtyrate.c @@ -0,0 +1,63 @@ +/* + * Dirtyrate implement code + * + * Copyright (c) 2017-2020 HUAWEI TECHNOLOGIES CO.,LTD. + * + * Authors: + * Chuan Zheng <zhengch...@huawei.com> + * + * This work is licensed under the terms of the GNU GPL, version 2 or later. + * See the COPYING file in the top-level directory. + */ + +#include "dirtyrate.h" + +static uint64_t sample_pages_per_gigabytes = DIRTYRATE_DEFAULT_SAMPLE_PAGES; +static uint64_t dirty_rate; /* MB/s */ +CalculatingDirtyRateStage calculating_dirty_rate_stage = CAL_DIRTY_RATE_INIT; + +static bool calculate_dirtyrate(struct dirtyrate_config config, + uint64_t *dirty_rate, int64_t time) +{ + /* todo */ + return true; +} + +static void set_dirty_rate(uint64_t drate) +{ + dirty_rate = drate; +} + +/* + * There are multithread will write/read *calculating_dirty_rate_stage*, + * we can protect only one thread write/read it by libvirt api. + * So we don't add mutex_lock to protect it here, but we must calculate + * dirty_rate by libvirt api. + */ +static void set_dirty_rate_stage(CalculatingDirtyRateStage ratestage) +{ + calculating_dirty_rate_stage = ratestage; +} + +void *get_dirtyrate_thread(void *arg) +{ + struct dirtyrate_config config = *(struct dirtyrate_config *)arg; + uint64_t dirty_rate; + uint64_t hash_dirty_rate; + bool query_succ; + int64_t msec = 0; + + set_dirty_rate_stage(CAL_DIRTY_RATE_ING); + + query_succ = calculate_dirtyrate(config, &hash_dirty_rate, msec); + if (!query_succ) { + dirty_rate = 0; + } else { + dirty_rate = hash_dirty_rate; + } + + set_dirty_rate(dirty_rate); + set_dirty_rate_stage(CAL_DIRTY_RATE_END); + + return NULL; +} diff --git a/migration/dirtyrate.h b/migration/dirtyrate.h new file mode 100644 index 0000000..9a5c228 --- /dev/null +++ b/migration/dirtyrate.h @@ -0,0 +1,38 @@ +/* + * Dirtyrate common functions + * + * Copyright (c) 2020 HUAWEI TECHNOLOGIES CO., LTD. + * + * Authors: + * Chuan Zheng <zhengch...@huawei.com> + * + * This work is licensed under the terms of the GNU GPL, version 2 or later. + * See the COPYING file in the top-level directory. + */ + +#ifndef QEMU_MIGRATION_DIRTYRATE_H +#define QEMU_MIGRATION_DIRTYRATE_H + +/* take 256 pages per GB for cal dirty rate */ +#define DIRTYRATE_DEFAULT_SAMPLE_PAGES 256 + +struct dirtyrate_config { + uint64_t sample_pages_per_gigabytes; + int64_t sample_period_seconds; +}; + +/* + * To record calculate dirty_rate status: + * 0: initial status, calculating thread is not be created here. + * 1: calculating thread is created. + * 2: calculating thread is end, we can get result. + */ +typedef enum { + CAL_DIRTY_RATE_INIT = 0, + CAL_DIRTY_RATE_ING = 1, + CAL_DIRTY_RATE_END = 2, +} CalculatingDirtyRateStage; + +void *get_dirtyrate_thread(void *arg); +#endif + -- 1.8.3.1