14240dceeSChuan Zheng /* 24240dceeSChuan Zheng * Dirtyrate common functions 34240dceeSChuan Zheng * 44240dceeSChuan Zheng * Copyright (c) 2020 HUAWEI TECHNOLOGIES CO., LTD. 54240dceeSChuan Zheng * 64240dceeSChuan Zheng * Authors: 74240dceeSChuan Zheng * Chuan Zheng <zhengchuan@huawei.com> 84240dceeSChuan Zheng * 94240dceeSChuan Zheng * This work is licensed under the terms of the GNU GPL, version 2 or later. 104240dceeSChuan Zheng * See the COPYING file in the top-level directory. 114240dceeSChuan Zheng */ 124240dceeSChuan Zheng 134240dceeSChuan Zheng #ifndef QEMU_MIGRATION_DIRTYRATE_H 144240dceeSChuan Zheng #define QEMU_MIGRATION_DIRTYRATE_H 154240dceeSChuan Zheng 168244166dSHyman Huang(黄勇) #include "sysemu/dirtyrate.h" 178244166dSHyman Huang(黄勇) 184240dceeSChuan Zheng /* 194240dceeSChuan Zheng * Sample 512 pages per GB as default. 204240dceeSChuan Zheng */ 214240dceeSChuan Zheng #define DIRTYRATE_DEFAULT_SAMPLE_PAGES 512 224240dceeSChuan Zheng 23a2635f0aSChuan Zheng /* 24a2635f0aSChuan Zheng * Record ramblock idstr 25a2635f0aSChuan Zheng */ 26a2635f0aSChuan Zheng #define RAMBLOCK_INFO_MAX_LEN 256 27a2635f0aSChuan Zheng 28f82583cdSChuan Zheng /* 29f82583cdSChuan Zheng * Minimum RAMBlock size to sample, in megabytes. 30f82583cdSChuan Zheng */ 31f82583cdSChuan Zheng #define MIN_RAMBLOCK_SIZE 128 32f82583cdSChuan Zheng 33eca58224SChuan Zheng /* 34*34a68001SAndrei Gudkov * Allowed range for dirty page rate calculation (in milliseconds). 35*34a68001SAndrei Gudkov * Lower limit relates to the smallest realistic downtime it 36*34a68001SAndrei Gudkov * makes sense to impose on migration. 37eca58224SChuan Zheng */ 38*34a68001SAndrei Gudkov #define MIN_CALC_TIME_MS 50 39*34a68001SAndrei Gudkov #define MAX_CALC_TIME_MS 60000 40eca58224SChuan Zheng 417afa08cdSHyman Huang(黄勇) /* 427afa08cdSHyman Huang(黄勇) * Take 1/16 pages in 1G as the maxmum sample page count 437afa08cdSHyman Huang(黄勇) */ 447afa08cdSHyman Huang(黄勇) #define MIN_SAMPLE_PAGE_COUNT 128 457afa08cdSHyman Huang(黄勇) #define MAX_SAMPLE_PAGE_COUNT 16384 467afa08cdSHyman Huang(黄勇) 474240dceeSChuan Zheng struct DirtyRateConfig { 484240dceeSChuan Zheng uint64_t sample_pages_per_gigabytes; /* sample pages per GB */ 49*34a68001SAndrei Gudkov int64_t calc_time_ms; /* desired calculation time (in milliseconds) */ 5071864eadSHyman Huang(黄勇) DirtyRateMeasureMode mode; /* mode of dirtyrate measurement */ 514240dceeSChuan Zheng }; 524240dceeSChuan Zheng 53a2635f0aSChuan Zheng /* 54a2635f0aSChuan Zheng * Store dirtypage info for each ramblock. 55a2635f0aSChuan Zheng */ 56a2635f0aSChuan Zheng struct RamblockDirtyInfo { 57a2635f0aSChuan Zheng char idstr[RAMBLOCK_INFO_MAX_LEN]; /* idstr for each ramblock */ 58a2635f0aSChuan Zheng uint8_t *ramblock_addr; /* base address of ramblock we measure */ 59a2635f0aSChuan Zheng uint64_t ramblock_pages; /* ramblock size in TARGET_PAGE_SIZE */ 60a2635f0aSChuan Zheng uint64_t *sample_page_vfn; /* relative offset address for sampled page */ 61a2635f0aSChuan Zheng uint64_t sample_pages_count; /* count of sampled pages */ 62a2635f0aSChuan Zheng uint64_t sample_dirty_count; /* count of dirty pages we measure */ 63a2635f0aSChuan Zheng uint32_t *hash_result; /* array of hash result for sampled pages */ 64a2635f0aSChuan Zheng }; 65a2635f0aSChuan Zheng 6671864eadSHyman Huang(黄勇) typedef struct SampleVMStat { 6771864eadSHyman Huang(黄勇) uint64_t total_dirty_samples; /* total dirty sampled page */ 6871864eadSHyman Huang(黄勇) uint64_t total_sample_count; /* total sampled pages */ 6971864eadSHyman Huang(黄勇) uint64_t total_block_mem_MB; /* size of total sampled pages in MB */ 7071864eadSHyman Huang(黄勇) } SampleVMStat; 7171864eadSHyman Huang(黄勇) 72c9a58d71SChuan Zheng /* 73c9a58d71SChuan Zheng * Store calculation statistics for each measure. 74c9a58d71SChuan Zheng */ 75c9a58d71SChuan Zheng struct DirtyRateStat { 76c9a58d71SChuan Zheng int64_t dirty_rate; /* dirty rate in MB/s */ 77c9a58d71SChuan Zheng int64_t start_time; /* calculation start time in units of second */ 78*34a68001SAndrei Gudkov int64_t calc_time_ms; /* actual calculation time (in milliseconds) */ 797afa08cdSHyman Huang(黄勇) uint64_t sample_pages; /* sample pages per GB */ 8071864eadSHyman Huang(黄勇) union { 8171864eadSHyman Huang(黄勇) SampleVMStat page_sampling; 8271864eadSHyman Huang(黄勇) VcpuStat dirty_ring; 8371864eadSHyman Huang(黄勇) }; 84c9a58d71SChuan Zheng }; 85c9a58d71SChuan Zheng 864240dceeSChuan Zheng void *get_dirtyrate_thread(void *arg); 874240dceeSChuan Zheng #endif 88