Commit 56ba83d2 authored by zhanghailiang's avatar zhanghailiang Committed by Amit Shah
Browse files

COLO: Establish a new communicating path for COLO



This new communication path will be used for returning messages
from Secondary side to Primary side.

Signed-off-by: default avatarzhanghailiang <zhang.zhanghailiang@huawei.com>
Signed-off-by: default avatarLi Zhijian <lizhijian@cn.fujitsu.com>
Reviewed-by: default avatarDr. David Alan Gilbert <dgilbert@redhat.com>
Reviewed-by: default avatarAmit Shah <amit.shah@redhat.com>
Signed-off-by: default avatarAmit Shah <amit@amitshah.net>
parent 25d0c16f
Loading
Loading
Loading
Loading
+28 −0
Original line number Diff line number Diff line
@@ -14,6 +14,7 @@
#include "sysemu/sysemu.h"
#include "migration/colo.h"
#include "trace.h"
#include "qemu/error-report.h"

bool colo_supported(void)
{
@@ -36,6 +37,12 @@ bool migration_incoming_in_colo_state(void)

static void colo_process_checkpoint(MigrationState *s)
{
    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");
        goto out;
    }

    qemu_mutex_lock_iothread();
    vm_start();
    qemu_mutex_unlock_iothread();
@@ -43,6 +50,10 @@ static void colo_process_checkpoint(MigrationState *s)

    /* TODO: COLO checkpoint savevm loop */

out:
    if (s->rp_state.from_dst_file) {
        qemu_fclose(s->rp_state.from_dst_file);
    }
}

void migrate_start_colo_process(MigrationState *s)
@@ -61,8 +72,25 @@ void *colo_process_incoming_thread(void *opaque)
    migrate_set_state(&mis->state, MIGRATION_STATUS_ACTIVE,
                      MIGRATION_STATUS_COLO);

    mis->to_src_file = qemu_file_get_return_path(mis->from_src_file);
    if (!mis->to_src_file) {
        error_report("COLO incoming thread: Open QEMUFile to_src_file failed");
        goto out;
    }
    /*
     * Note: the communication between Primary side and Secondary side
     * should be sequential, we set the fd to unblocked in migration incoming
     * coroutine, and here we are in the COLO incoming thread, so it is ok to
     * set the fd back to blocked.
     */
    qemu_file_set_blocking(mis->from_src_file, true);

    /* TODO: COLO checkpoint restore loop */

out:
    if (mis->to_src_file) {
        qemu_fclose(mis->to_src_file);
    }
    migration_incoming_exit_colo();

    return NULL;