@@ -114,10 +114,22 @@ static void secondary_vm_do_failover(void)
}
}
+static void colo_set_filter_status(const char *status, Error **errp)
+{
+ struct COLOListNode *e, *next;
+ NetFilterState *nf;
+
+ QLIST_FOREACH_SAFE(e, &COLOBufferFilters, node, next) {
+ nf = e->opaque;
+ object_property_set_str(OBJECT(nf), status, "status", errp);
+ }
+}
+
static void primary_vm_do_failover(void)
{
MigrationState *s = migrate_get_current();
int old_state;
+ Error *local_err = NULL;
migrate_set_state(&s->state, MIGRATION_STATUS_COLO,
MIGRATION_STATUS_COMPLETED);
@@ -141,6 +153,12 @@ static void primary_vm_do_failover(void)
old_state);
return;
}
+
+ colo_set_filter_status("off", &local_err);
+ if (local_err) {
+ error_report_err(local_err);
+ }
+
/* Notify COLO thread that failover work is finished */
qemu_sem_post(&s->colo_sem);
}
@@ -299,7 +317,11 @@ static int colo_do_checkpoint_transaction(MigrationState *s,
if (failover_request_is_active()) {
goto out;
}
-
+ /* Stop buffer filter and flush the buffered packets */
+ colo_set_filter_status("off", &local_err);
+ if (local_err) {
+ goto out;
+ }
colo_send_message(s->to_dst_file, COLO_MESSAGE_VMSTATE_SEND, &local_err);
if (local_err) {
goto out;
@@ -363,6 +385,10 @@ static int colo_do_checkpoint_transaction(MigrationState *s,
qemu_thread_exit(0);
}
+ colo_set_filter_status("on", &local_err);
+ if (local_err) {
+ goto out;
+ }
ret = 0;
/* Resume primary guest */
qemu_mutex_lock_iothread();
@@ -432,6 +458,11 @@ static void colo_process_checkpoint(MigrationState *s)
failover_init_state();
+ colo_set_filter_status("on", &local_err);
+ if (local_err) {
+ goto out;
+ }
+
s->rp_state.from_dst_file = qemu_file_get_return_path(s->to_dst_file);
if (!s->rp_state.from_dst_file) {
error_report("Open QEMUFile from_dst_file failed");
Enable all buffer filters that added by COLO while go into COLO process, and disable them while exit COLO. Signed-off-by: zhanghailiang <zhang.zhanghailiang@huawei.com> Cc: Jason Wang <jasowang@redhat.com> Cc: Yang Hongyang <hongyang.yang@easystack.cn> --- v16: - Stop buffer filter while doing checkpoint and resume it after checkpoint. v15: - Re-implement colo_set_filter_status() based on COLOBufferFilters list. - Fix the title of this patch --- migration/colo.c | 33 ++++++++++++++++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-)