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:
parent
15eb2d644c
commit
9865d0f68f
@ -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);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user