migration/dirtyrate: move init step of calculation to main thread

since main thread may "query dirty rate" at any time, it's better
to move init step into main thead so that synchronization overhead
between "main" and "get_dirtyrate" can be reduced.

Signed-off-by: Hyman Huang(黄勇) <huangy81@chinatelecom.cn>
Message-Id: <109f8077518ed2f13068e3bfb10e625e964780f1.1624040308.git.huangy81@chinatelecom.cn>
Reviewed-by: Peter Xu <peterx@redhat.com>
Reviewed-by: Juan Quintela <quintela@redhat.com>
Signed-off-by: Juan Quintela <quintela@redhat.com>
This commit is contained in:
Hyman Huang(黄勇) 2021-06-29 16:01:22 +00:00 committed by Juan Quintela
parent 15eb2d644c
commit 9865d0f68f

View File

@ -380,7 +380,6 @@ void *get_dirtyrate_thread(void *arg)
{ {
struct DirtyRateConfig config = *(struct DirtyRateConfig *)arg; struct DirtyRateConfig config = *(struct DirtyRateConfig *)arg;
int ret; int ret;
int64_t start_time;
rcu_register_thread(); rcu_register_thread();
ret = dirtyrate_set_state(&CalculatingState, DIRTY_RATE_STATUS_UNSTARTED, ret = dirtyrate_set_state(&CalculatingState, DIRTY_RATE_STATUS_UNSTARTED,
@ -390,9 +389,6 @@ void *get_dirtyrate_thread(void *arg)
return NULL; return NULL;
} }
start_time = qemu_clock_get_ms(QEMU_CLOCK_REALTIME) / 1000;
init_dirtyrate_stat(start_time, config);
calculate_dirtyrate(config); calculate_dirtyrate(config);
ret = dirtyrate_set_state(&CalculatingState, DIRTY_RATE_STATUS_MEASURING, ret = dirtyrate_set_state(&CalculatingState, DIRTY_RATE_STATUS_MEASURING,
@ -411,6 +407,7 @@ void qmp_calc_dirty_rate(int64_t calc_time, bool has_sample_pages,
static struct DirtyRateConfig config; static struct DirtyRateConfig config;
QemuThread thread; QemuThread thread;
int ret; int ret;
int64_t start_time;
/* /*
* If the dirty rate is already being measured, don't attempt to start. * If the dirty rate is already being measured, don't attempt to start.
@ -451,6 +448,10 @@ void qmp_calc_dirty_rate(int64_t calc_time, bool has_sample_pages,
config.sample_period_seconds = calc_time; config.sample_period_seconds = calc_time;
config.sample_pages_per_gigabytes = sample_pages; config.sample_pages_per_gigabytes = sample_pages;
config.mode = DIRTY_RATE_MEASURE_MODE_PAGE_SAMPLING; config.mode = DIRTY_RATE_MEASURE_MODE_PAGE_SAMPLING;
start_time = qemu_clock_get_ms(QEMU_CLOCK_REALTIME) / 1000;
init_dirtyrate_stat(start_time, config);
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);
} }