migration/dirtyrate: Implement set_sample_page_period() and is_sample_period_valid()

Implement is_sample_period_valid() to check if the sample period is vaild and
do set_sample_page_period() to sleep specific time between sample actions.

Signed-off-by: Chuan Zheng <zhengchuan@huawei.com>
Reviewed-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
Reviewed-by: David Edmondson <david.edmondson@oracle.com>
Reviewed-by: Li Qiang <liq3ea@gmail.com>
Message-Id: <1600237327-33618-10-git-send-email-zhengchuan@huawei.com>
Signed-off-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
This commit is contained in:
Chuan Zheng 2020-09-16 14:22:04 +08:00 committed by Dr. David Alan Gilbert
parent f82583cdc0
commit eca582249c
2 changed files with 30 additions and 0 deletions

View File

@ -27,6 +27,30 @@
static int CalculatingState = DIRTY_RATE_STATUS_UNSTARTED;
static struct DirtyRateStat DirtyStat;
static int64_t set_sample_page_period(int64_t msec, int64_t initial_time)
{
int64_t current_time;
current_time = qemu_clock_get_ms(QEMU_CLOCK_REALTIME);
if ((current_time - initial_time) >= msec) {
msec = current_time - initial_time;
} else {
g_usleep((msec + initial_time - current_time) * 1000);
}
return msec;
}
static bool is_sample_period_valid(int64_t sec)
{
if (sec < MIN_FETCH_DIRTYRATE_TIME_SEC ||
sec > MAX_FETCH_DIRTYRATE_TIME_SEC) {
return false;
}
return true;
}
static int dirtyrate_set_state(int *state, int old_state, int new_state)
{
assert(new_state < DIRTY_RATE_STATUS__MAX);

View File

@ -29,6 +29,12 @@
*/
#define MIN_RAMBLOCK_SIZE 128
/*
* Take 1s as minimum time for calculation duration
*/
#define MIN_FETCH_DIRTYRATE_TIME_SEC 1
#define MAX_FETCH_DIRTYRATE_TIME_SEC 60
struct DirtyRateConfig {
uint64_t sample_pages_per_gigabytes; /* sample pages per GB */
int64_t sample_period_seconds; /* time duration between two sampling */