|
@@ -48,6 +48,12 @@ static bool is_sample_period_valid(int64_t sec)
|
|
return true;
|
|
return true;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+static bool is_sample_pages_valid(int64_t pages)
|
|
|
|
+{
|
|
|
|
+ return pages >= MIN_SAMPLE_PAGE_COUNT &&
|
|
|
|
+ pages <= MAX_SAMPLE_PAGE_COUNT;
|
|
|
|
+}
|
|
|
|
+
|
|
static int dirtyrate_set_state(int *state, int old_state, int new_state)
|
|
static int dirtyrate_set_state(int *state, int old_state, int new_state)
|
|
{
|
|
{
|
|
assert(new_state < DIRTY_RATE_STATUS__MAX);
|
|
assert(new_state < DIRTY_RATE_STATUS__MAX);
|
|
@@ -72,13 +78,15 @@ static struct DirtyRateInfo *query_dirty_rate_info(void)
|
|
info->status = CalculatingState;
|
|
info->status = CalculatingState;
|
|
info->start_time = DirtyStat.start_time;
|
|
info->start_time = DirtyStat.start_time;
|
|
info->calc_time = DirtyStat.calc_time;
|
|
info->calc_time = DirtyStat.calc_time;
|
|
|
|
+ info->sample_pages = DirtyStat.sample_pages;
|
|
|
|
|
|
trace_query_dirty_rate_info(DirtyRateStatus_str(CalculatingState));
|
|
trace_query_dirty_rate_info(DirtyRateStatus_str(CalculatingState));
|
|
|
|
|
|
return info;
|
|
return info;
|
|
}
|
|
}
|
|
|
|
|
|
-static void init_dirtyrate_stat(int64_t start_time, int64_t calc_time)
|
|
|
|
|
|
+static void init_dirtyrate_stat(int64_t start_time, int64_t calc_time,
|
|
|
|
+ uint64_t sample_pages)
|
|
{
|
|
{
|
|
DirtyStat.total_dirty_samples = 0;
|
|
DirtyStat.total_dirty_samples = 0;
|
|
DirtyStat.total_sample_count = 0;
|
|
DirtyStat.total_sample_count = 0;
|
|
@@ -86,6 +94,7 @@ static void init_dirtyrate_stat(int64_t start_time, int64_t calc_time)
|
|
DirtyStat.dirty_rate = -1;
|
|
DirtyStat.dirty_rate = -1;
|
|
DirtyStat.start_time = start_time;
|
|
DirtyStat.start_time = start_time;
|
|
DirtyStat.calc_time = calc_time;
|
|
DirtyStat.calc_time = calc_time;
|
|
|
|
+ DirtyStat.sample_pages = sample_pages;
|
|
}
|
|
}
|
|
|
|
|
|
static void update_dirtyrate_stat(struct RamblockDirtyInfo *info)
|
|
static void update_dirtyrate_stat(struct RamblockDirtyInfo *info)
|
|
@@ -361,6 +370,7 @@ void *get_dirtyrate_thread(void *arg)
|
|
int ret;
|
|
int ret;
|
|
int64_t start_time;
|
|
int64_t start_time;
|
|
int64_t calc_time;
|
|
int64_t calc_time;
|
|
|
|
+ uint64_t sample_pages;
|
|
|
|
|
|
ret = dirtyrate_set_state(&CalculatingState, DIRTY_RATE_STATUS_UNSTARTED,
|
|
ret = dirtyrate_set_state(&CalculatingState, DIRTY_RATE_STATUS_UNSTARTED,
|
|
DIRTY_RATE_STATUS_MEASURING);
|
|
DIRTY_RATE_STATUS_MEASURING);
|
|
@@ -371,7 +381,8 @@ void *get_dirtyrate_thread(void *arg)
|
|
|
|
|
|
start_time = qemu_clock_get_ms(QEMU_CLOCK_REALTIME) / 1000;
|
|
start_time = qemu_clock_get_ms(QEMU_CLOCK_REALTIME) / 1000;
|
|
calc_time = config.sample_period_seconds;
|
|
calc_time = config.sample_period_seconds;
|
|
- init_dirtyrate_stat(start_time, calc_time);
|
|
|
|
|
|
+ sample_pages = config.sample_pages_per_gigabytes;
|
|
|
|
+ init_dirtyrate_stat(start_time, calc_time, sample_pages);
|
|
|
|
|
|
calculate_dirtyrate(config);
|
|
calculate_dirtyrate(config);
|
|
|
|
|
|
@@ -383,7 +394,8 @@ void *get_dirtyrate_thread(void *arg)
|
|
return NULL;
|
|
return NULL;
|
|
}
|
|
}
|
|
|
|
|
|
-void qmp_calc_dirty_rate(int64_t calc_time, Error **errp)
|
|
|
|
|
|
+void qmp_calc_dirty_rate(int64_t calc_time, bool has_sample_pages,
|
|
|
|
+ int64_t sample_pages, Error **errp)
|
|
{
|
|
{
|
|
static struct DirtyRateConfig config;
|
|
static struct DirtyRateConfig config;
|
|
QemuThread thread;
|
|
QemuThread thread;
|
|
@@ -404,6 +416,17 @@ void qmp_calc_dirty_rate(int64_t calc_time, Error **errp)
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ if (has_sample_pages) {
|
|
|
|
+ if (!is_sample_pages_valid(sample_pages)) {
|
|
|
|
+ error_setg(errp, "sample-pages is out of range[%d, %d].",
|
|
|
|
+ MIN_SAMPLE_PAGE_COUNT,
|
|
|
|
+ MAX_SAMPLE_PAGE_COUNT);
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+ } else {
|
|
|
|
+ sample_pages = DIRTYRATE_DEFAULT_SAMPLE_PAGES;
|
|
|
|
+ }
|
|
|
|
+
|
|
/*
|
|
/*
|
|
* Init calculation state as unstarted.
|
|
* Init calculation state as unstarted.
|
|
*/
|
|
*/
|
|
@@ -415,7 +438,7 @@ void qmp_calc_dirty_rate(int64_t calc_time, Error **errp)
|
|
}
|
|
}
|
|
|
|
|
|
config.sample_period_seconds = calc_time;
|
|
config.sample_period_seconds = calc_time;
|
|
- config.sample_pages_per_gigabytes = DIRTYRATE_DEFAULT_SAMPLE_PAGES;
|
|
|
|
|
|
+ config.sample_pages_per_gigabytes = sample_pages;
|
|
qemu_thread_create(&thread, "get_dirtyrate", get_dirtyrate_thread,
|
|
qemu_thread_create(&thread, "get_dirtyrate", get_dirtyrate_thread,
|
|
(void *)&config, QEMU_THREAD_DETACHED);
|
|
(void *)&config, QEMU_THREAD_DETACHED);
|
|
}
|
|
}
|