From: Hailiang Zhang <zhang.zhanghailiang@huawei.com>
To: Li Zhijian <lizhijian@cn.fujitsu.com>, qemu-devel@nongnu.org
Cc: peter.huangpeng@huawei.com, amit.shah@redhat.com,
quintela@redhat.com, dgilbert@redhat.com, eblake@redhat.com,
eddie.dong@intel.com, yunhong.jiang@intel.com,
wency@cn.fujitsu.com, arei.gonglei@huawei.com,
stefanha@redhat.com, hongyang.yang@easystack.cn,
zhangchen.fnst@cn.fujitsu.com, xiecl.fnst@cn.fujitsu.com,
armbru@redhat.com
Subject: Re: [Qemu-devel] [PATCH COLO-Frame v16 16/35] COLO: synchronize PVM's state to SVM periodically
Date: Tue, 12 Apr 2016 21:01:56 +0800 [thread overview]
Message-ID: <570CF1C4.5000408@huawei.com> (raw)
In-Reply-To: <570C6561.201@cn.fujitsu.com>
On 2016/4/12 11:02, Li Zhijian wrote:
>
>
> On 04/08/2016 02:26 PM, zhanghailiang wrote:
>> Do checkpoint periodically, the default interval is 200ms.
>>
>> Signed-off-by: zhanghailiang <zhang.zhanghailiang@huawei.com>
>> Signed-off-by: Li Zhijian <lizhijian@cn.fujitsu.com>
>> Reviewed-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
>> ---
>> v12:
>> - Add Reviewed-by tag
>> v11:
>> - Fix wrong sleep time for checkpoint period. (Dave's comment)
>> ---
>> migration/colo.c | 12 ++++++++++++
>> 1 file changed, 12 insertions(+)
>>
>> diff --git a/migration/colo.c b/migration/colo.c
>> index 4dae069..4e3b39f 100644
>> --- a/migration/colo.c
>> +++ b/migration/colo.c
>> @@ -11,6 +11,7 @@
>> */
>>
>> #include "qemu/osdep.h"
>> +#include "qemu/timer.h"
>> #include "sysemu/sysemu.h"
>> #include "migration/colo.h"
>> #include "trace.h"
>> @@ -231,6 +232,7 @@ out:
>> static void colo_process_checkpoint(MigrationState *s)
>> {
>> QEMUSizedBuffer *buffer = NULL;
>> + int64_t current_time, checkpoint_time = qemu_clock_get_ms(QEMU_CLOCK_HOST);
>> Error *local_err = NULL;
>> int ret;
>>
>> @@ -262,11 +264,21 @@ static void colo_process_checkpoint(MigrationState *s)
>> trace_colo_vm_state_change("stop", "run");
>>
>> while (s->state == MIGRATION_STATUS_COLO) {
>> + current_time = qemu_clock_get_ms(QEMU_CLOCK_HOST);
>> + if (current_time - checkpoint_time <
>> + s->parameters[MIGRATION_PARAMETER_X_CHECKPOINT_DELAY]) {
>> + int64_t delay_ms;
>> +
>> + delay_ms = s->parameters[MIGRATION_PARAMETER_X_CHECKPOINT_DELAY] -
>> + (current_time - checkpoint_time);
>> + g_usleep(delay_ms * 1000);
>
> Once a large value(e.g. 1000000) is set to s->parameters[MIGRATION_PARAMETER_X_CHECKPOINT_DELAY],
> that means here will sleep 1000 seconds and people can't revert this operation.
> Can we let this sleep operation more flexible ?
>
Good catch, that is really a problem, we can solve it by the follow patch,
it will simplify the delay time process in COLO and benefits the later COLO
that based on colo-proxy. the colo-proxy thread can call colo_checkpoint_notify()
directly to notify COLO thread to do checkpoint.
I will not update COLO frame with this patch for now, since it is experimental
and the related patches have been reviewed, i will keep it as a optimized
patch for later COLO. Thanks.
From bde668d63c182540a013074a70c7a37474aedf94 Mon Sep 17 00:00:00 2001
From: zhanghailiang <zhang.zhanghailiang@huawei.com>
Date: Wed, 13 Apr 2016 01:11:09 +0800
Subject: [PATCH] COLO: use timer to notify COLO to do checkpoint
Signed-off-by: zhanghailiang <zhang.zhanghailiang@huawei.com>
---
include/migration/colo.h | 1 +
include/migration/migration.h | 2 ++
migration/colo.c | 33 ++++++++++++++++++++-------------
migration/migration.c | 1 +
4 files changed, 24 insertions(+), 13 deletions(-)
diff --git a/include/migration/colo.h b/include/migration/colo.h
index 87ea6d2..9f0098e 100644
--- a/include/migration/colo.h
+++ b/include/migration/colo.h
@@ -38,5 +38,6 @@ void colo_do_failover(MigrationState *s);
bool colo_shutdown(void);
void colo_add_buffer_filter(Notifier *notifier, void *data);
+void colo_checkpoint_notify(void *opaque);
#endif
diff --git a/include/migration/migration.h b/include/migration/migration.h
index 1009918..fed5a14 100644
--- a/include/migration/migration.h
+++ b/include/migration/migration.h
@@ -181,6 +181,8 @@ struct MigrationState
RAMBlock *last_req_rb;
QemuSemaphore colo_sem;
+ int64_t checkpoint_time;
+ QEMUTimer *delay_timer;
};
void migrate_set_state(int *state, int old_state, int new_state);
diff --git a/migration/colo.c b/migration/colo.c
index 56260d8..9fb1a30 100644
--- a/migration/colo.c
+++ b/migration/colo.c
@@ -474,7 +474,7 @@ void colo_add_buffer_filter(Notifier *notifier, void *data)
static void colo_process_checkpoint(MigrationState *s)
{
QEMUSizedBuffer *buffer = NULL;
- int64_t current_time, checkpoint_time = qemu_clock_get_ms(QEMU_CLOCK_HOST);
+ int64_t current_time = qemu_clock_get_ms(QEMU_CLOCK_HOST);
Error *local_err = NULL;
int ret;
@@ -528,29 +528,22 @@ static void colo_process_checkpoint(MigrationState *s)
if (ret < 0) {
goto out;
}
-
+ timer_mod(s->delay_timer,
+ current_time + s->parameters[MIGRATION_PARAMETER_X_CHECKPOINT_DELAY]);
while (s->state == MIGRATION_STATUS_COLO) {
if (failover_request_is_active()) {
error_report("failover request");
goto out;
}
- current_time = qemu_clock_get_ms(QEMU_CLOCK_HOST);
- if ((current_time - checkpoint_time <
- s->parameters[MIGRATION_PARAMETER_X_CHECKPOINT_DELAY]) &&
- !colo_shutdown_requested) {
- int64_t delay_ms;
-
- delay_ms = s->parameters[MIGRATION_PARAMETER_X_CHECKPOINT_DELAY] -
- (current_time - checkpoint_time);
- g_usleep(delay_ms * 1000);
+ if (!colo_shutdown_requested) {
+ qemu_sem_wait(&s->colo_sem);
}
/* start a colo checkpoint */
ret = colo_do_checkpoint_transaction(s, buffer);
if (ret < 0) {
goto out;
}
- checkpoint_time = qemu_clock_get_ms(QEMU_CLOCK_HOST);
}
out:
@@ -572,7 +565,7 @@ out:
qsb_free(buffer);
buffer = NULL;
-
+ timer_del(s->delay_timer);
/* Hope this not to be too long to wait here */
qemu_sem_wait(&s->colo_sem);
qemu_sem_destroy(&s->colo_sem);
@@ -586,12 +579,26 @@ out:
}
}
+void colo_checkpoint_notify(void *opaque)
+{
+ MigrationState *s = opaque;
+ int64_t next_notify_time;
+
+ qemu_sem_post(&s->colo_sem);
+ s->checkpoint_time = qemu_clock_get_ms(QEMU_CLOCK_HOST);
+ next_notify_time = s->checkpoint_time +
+ s->parameters[MIGRATION_PARAMETER_X_CHECKPOINT_DELAY];
+ timer_mod(s->delay_timer, next_notify_time);
+}
+
void migrate_start_colo_process(MigrationState *s)
{
qemu_mutex_unlock_iothread();
qemu_sem_init(&s->colo_sem, 0);
migrate_set_state(&s->state, MIGRATION_STATUS_ACTIVE,
MIGRATION_STATUS_COLO);
+ s->delay_timer = timer_new_ms(QEMU_CLOCK_HOST, colo_checkpoint_notify,
+ s);
colo_process_checkpoint(s);
qemu_mutex_lock_iothread();
}
diff --git a/migration/migration.c b/migration/migration.c
index 3bceecc..8907075 100644
--- a/migration/migration.c
+++ b/migration/migration.c
@@ -825,6 +825,7 @@ void qmp_migrate_set_parameters(bool has_compress_level,
if (has_x_checkpoint_delay) {
s->parameters[MIGRATION_PARAMETER_X_CHECKPOINT_DELAY] =
x_checkpoint_delay;
+ colo_checkpoint_notify(s);
}
}
--
1.8.3.1
> Thanks
> Li Zhijian
>
>> + }
>> /* start a colo checkpoint */
>> ret = colo_do_checkpoint_transaction(s, buffer);
>> if (ret < 0) {
>> goto out;
>> }
>> + checkpoint_time = qemu_clock_get_ms(QEMU_CLOCK_HOST);
>> }
>>
>> out:
>>
>
next prev parent reply other threads:[~2016-04-12 13:02 UTC|newest]
Thread overview: 54+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-04-08 6:26 [Qemu-devel] [PATCH COLO-Frame v16 for-2.7 00/35] COarse-grain LOck-stepping(COLO) Virtual Machines for Non-stop Service (FT) zhanghailiang
2016-04-08 6:26 ` [Qemu-devel] [PATCH COLO-Frame v16 01/35] configure: Add parameter for configure to enable/disable COLO support zhanghailiang
2016-04-08 6:26 ` [Qemu-devel] [PATCH COLO-Frame v16 02/35] migration: Introduce capability 'x-colo' to migration zhanghailiang
2016-04-08 6:26 ` [Qemu-devel] [PATCH COLO-Frame v16 03/35] COLO: migrate colo related info to secondary node zhanghailiang
2016-04-08 6:26 ` [Qemu-devel] [PATCH COLO-Frame v16 04/35] migration: Integrate COLO checkpoint process into migration zhanghailiang
2016-04-08 6:26 ` [Qemu-devel] [PATCH COLO-Frame v16 05/35] migration: Integrate COLO checkpoint process into loadvm zhanghailiang
2016-04-08 6:26 ` [Qemu-devel] [PATCH COLO-Frame v16 06/35] COLO/migration: Create a new communication path from destination to source zhanghailiang
2016-04-08 6:26 ` [Qemu-devel] [PATCH COLO-Frame v16 07/35] COLO: Implement colo checkpoint protocol zhanghailiang
2016-04-08 6:26 ` [Qemu-devel] [PATCH COLO-Frame v16 08/35] COLO: Add a new RunState RUN_STATE_COLO zhanghailiang
2016-04-08 6:26 ` [Qemu-devel] [PATCH COLO-Frame v16 09/35] QEMUSizedBuffer: Introduce two help functions for qsb zhanghailiang
2016-04-08 6:26 ` [Qemu-devel] [PATCH COLO-Frame v16 10/35] COLO: Save PVM state to secondary side when do checkpoint zhanghailiang
2016-04-08 6:26 ` [Qemu-devel] [PATCH COLO-Frame v16 11/35] COLO: Load PVM's dirty pages into SVM's RAM cache temporarily zhanghailiang
2016-04-08 6:26 ` [Qemu-devel] [PATCH COLO-Frame v16 12/35] ram/COLO: Record the dirty pages that SVM received zhanghailiang
2016-04-08 6:26 ` [Qemu-devel] [PATCH COLO-Frame v16 13/35] COLO: Load VMState into qsb before restore it zhanghailiang
2016-04-22 10:12 ` Dr. David Alan Gilbert
2016-04-25 9:17 ` Hailiang Zhang
2016-04-08 6:26 ` [Qemu-devel] [PATCH COLO-Frame v16 14/35] COLO: Flush PVM's cached RAM into SVM's memory zhanghailiang
2016-04-08 6:26 ` [Qemu-devel] [PATCH COLO-Frame v16 15/35] COLO: Add checkpoint-delay parameter for migrate-set-parameters zhanghailiang
2016-04-08 6:26 ` [Qemu-devel] [PATCH COLO-Frame v16 16/35] COLO: synchronize PVM's state to SVM periodically zhanghailiang
2016-04-12 3:02 ` Li Zhijian
2016-04-12 13:01 ` Hailiang Zhang [this message]
2016-04-08 6:26 ` [Qemu-devel] [PATCH COLO-Frame v16 17/35] COLO failover: Introduce a new command to trigger a failover zhanghailiang
2016-04-08 6:26 ` [Qemu-devel] [PATCH COLO-Frame v16 18/35] COLO failover: Introduce state to record failover process zhanghailiang
2016-04-08 6:26 ` [Qemu-devel] [PATCH COLO-Frame v16 19/35] COLO: Implement failover work for Primary VM zhanghailiang
2016-04-08 6:26 ` [Qemu-devel] [PATCH COLO-Frame v16 20/35] COLO: Implement failover work for Secondary VM zhanghailiang
2016-04-08 6:26 ` [Qemu-devel] [PATCH COLO-Frame v16 21/35] qmp event: Add COLO_EXIT event to notify users while exited from COLO zhanghailiang
2016-04-22 14:25 ` Eric Blake
2016-04-25 9:33 ` Hailiang Zhang
2016-04-08 6:26 ` [Qemu-devel] [PATCH COLO-Frame v16 22/35] COLO failover: Shutdown related socket fd when do failover zhanghailiang
2016-04-08 6:26 ` [Qemu-devel] [PATCH COLO-Frame v16 23/35] COLO failover: Don't do failover during loading VM's state zhanghailiang
2016-05-06 9:09 ` Changlong Xie
2016-05-06 11:07 ` Hailiang Zhang
2016-04-08 6:26 ` [Qemu-devel] [PATCH COLO-Frame v16 24/35] COLO: Process shutdown command for VM in COLO state zhanghailiang
2016-04-08 6:26 ` [Qemu-devel] [PATCH COLO-Frame v16 25/35] COLO: Update the global runstate after going into colo state zhanghailiang
2016-04-08 6:26 ` [Qemu-devel] [PATCH COLO-Frame v16 26/35] savevm: Introduce two helper functions for save/find loadvm_handlers entry zhanghailiang
2016-04-08 6:26 ` [Qemu-devel] [PATCH COLO-Frame v16 27/35] migration/savevm: Add new helpers to process the different stages of loadvm zhanghailiang
2016-04-08 6:26 ` [Qemu-devel] [PATCH COLO-Frame v16 28/35] migration/savevm: Export two helper functions for savevm process zhanghailiang
2016-04-08 6:26 ` [Qemu-devel] [PATCH COLO-Frame v16 29/35] COLO: Separate the process of saving/loading ram and device state zhanghailiang
2016-04-08 6:26 ` [Qemu-devel] [PATCH COLO-Frame v16 30/35] COLO: Split qemu_savevm_state_begin out of checkpoint process zhanghailiang
2016-04-08 6:26 ` [Qemu-devel] [PATCH COLO-Frame v16 31/35] filter-buffer: Accept zero interval zhanghailiang
2016-04-08 6:26 ` [Qemu-devel] [PATCH COLO-Frame v16 32/35] net: Add notifier/callback for netdev init zhanghailiang
2016-04-21 0:30 ` Hailiang Zhang
2016-04-26 6:59 ` Jason Wang
2016-04-26 6:48 ` Jason Wang
2016-05-04 8:18 ` Hailiang Zhang
2016-04-08 6:26 ` [Qemu-devel] [PATCH COLO-Frame v16 33/35] COLO/filter: add each netdev a buffer filter zhanghailiang
2016-04-26 6:58 ` Jason Wang
2016-05-04 8:22 ` Hailiang Zhang
2016-04-08 6:26 ` [Qemu-devel] [PATCH COLO-Frame v16 34/35] COLO: manage the status of buffer filters for PVM zhanghailiang
2016-04-08 6:26 ` [Qemu-devel] [PATCH COLO-Frame v16 35/35] COLO: Add block replication into colo process zhanghailiang
2016-04-08 7:58 ` [Qemu-devel] [PATCH COLO-Frame v16 for-2.7 00/35] COarse-grain LOck-stepping(COLO) Virtual Machines for Non-stop Service (FT) Zhang Chen
2016-04-08 8:49 ` Hailiang Zhang
2016-04-22 10:42 ` Dr. David Alan Gilbert
2016-04-25 9:28 ` Hailiang Zhang
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=570CF1C4.5000408@huawei.com \
--to=zhang.zhanghailiang@huawei.com \
--cc=amit.shah@redhat.com \
--cc=arei.gonglei@huawei.com \
--cc=armbru@redhat.com \
--cc=dgilbert@redhat.com \
--cc=eblake@redhat.com \
--cc=eddie.dong@intel.com \
--cc=hongyang.yang@easystack.cn \
--cc=lizhijian@cn.fujitsu.com \
--cc=peter.huangpeng@huawei.com \
--cc=qemu-devel@nongnu.org \
--cc=quintela@redhat.com \
--cc=stefanha@redhat.com \
--cc=wency@cn.fujitsu.com \
--cc=xiecl.fnst@cn.fujitsu.com \
--cc=yunhong.jiang@intel.com \
--cc=zhangchen.fnst@cn.fujitsu.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.