Commit aad555c2 authored by Zhang Chen's avatar Zhang Chen Committed by Jason Wang
Browse files

COLO: Remove colo_state migration struct



We need to know if migration is going into COLO state for
incoming side before start normal migration.

Instead by using the VMStateDescription to send colo_state
from source side to destination side, we use MIG_CMD_ENABLE_COLO
to indicate whether COLO is enabled or not.

Signed-off-by: default avatarzhanghailiang <zhang.zhanghailiang@huawei.com>
Signed-off-by: default avatarZhang Chen <zhangckid@gmail.com>
Signed-off-by: default avatarZhang Chen <chen.zhang@intel.com>
Reviewed-by: default avatarDr. David Alan Gilbert <dgilbert@redhat.com>
Signed-off-by: default avatarJason Wang <jasowang@redhat.com>
parent 8e48ac95
Loading
Loading
Loading
Loading
+3 −2
Original line number Diff line number Diff line
@@ -28,8 +28,9 @@ void migrate_start_colo_process(MigrationState *s);
bool migration_in_colo_state(void);

/* loadvm */
bool migration_incoming_enable_colo(void);
void migration_incoming_exit_colo(void);
void migration_incoming_enable_colo(void);
void migration_incoming_disable_colo(void);
bool migration_incoming_colo_enabled(void);
void *colo_process_incoming_thread(void *opaque);
bool migration_incoming_in_colo_state(void);

+1 −1
Original line number Diff line number Diff line
common-obj-y += migration.o socket.o fd.o exec.o
common-obj-y += tls.o channel.o savevm.o
common-obj-y += colo-comm.o colo.o colo-failover.o
common-obj-y += colo.o colo-failover.o
common-obj-y += vmstate.o vmstate-types.o page_cache.o
common-obj-y += qemu-file.o global_state.o
common-obj-y += qemu-file-channel.o

migration/colo-comm.c

deleted100644 → 0
+0 −76
Original line number Diff line number Diff line
/*
 * COarse-grain LOck-stepping Virtual Machines for Non-stop Service (COLO)
 * (a.k.a. Fault Tolerance or Continuous Replication)
 *
 * Copyright (c) 2016 HUAWEI TECHNOLOGIES CO., LTD.
 * Copyright (c) 2016 FUJITSU LIMITED
 * Copyright (c) 2016 Intel Corporation
 *
 * This work is licensed under the terms of the GNU GPL, version 2 or
 * later. See the COPYING file in the top-level directory.
 *
 */

#include "qemu/osdep.h"
#include "migration.h"
#include "migration/colo.h"
#include "migration/vmstate.h"
#include "trace.h"

typedef struct {
     bool colo_requested;
} COLOInfo;

static COLOInfo colo_info;

COLOMode get_colo_mode(void)
{
    if (migration_in_colo_state()) {
        return COLO_MODE_PRIMARY;
    } else if (migration_incoming_in_colo_state()) {
        return COLO_MODE_SECONDARY;
    } else {
        return COLO_MODE_UNKNOWN;
    }
}

static int colo_info_pre_save(void *opaque)
{
    COLOInfo *s = opaque;

    s->colo_requested = migrate_colo_enabled();

    return 0;
}

static bool colo_info_need(void *opaque)
{
   return migrate_colo_enabled();
}

static const VMStateDescription colo_state = {
    .name = "COLOState",
    .version_id = 1,
    .minimum_version_id = 1,
    .pre_save = colo_info_pre_save,
    .needed = colo_info_need,
    .fields = (VMStateField[]) {
        VMSTATE_BOOL(colo_requested, COLOInfo),
        VMSTATE_END_OF_LIST()
    },
};

void colo_info_init(void)
{
    vmstate_register(NULL, 0, &colo_state, &colo_info);
}

bool migration_incoming_enable_colo(void)
{
    return colo_info.colo_requested;
}

void migration_incoming_exit_colo(void)
{
    colo_info.colo_requested = false;
}
+12 −1
Original line number Diff line number Diff line
@@ -152,6 +152,17 @@ static void primary_vm_do_failover(void)
    qemu_sem_post(&s->colo_exit_sem);
}

COLOMode get_colo_mode(void)
{
    if (migration_in_colo_state()) {
        return COLO_MODE_PRIMARY;
    } else if (migration_incoming_in_colo_state()) {
        return COLO_MODE_SECONDARY;
    } else {
        return COLO_MODE_UNKNOWN;
    }
}

void colo_do_failover(MigrationState *s)
{
    /* Make sure VM stopped while failover happened. */
@@ -746,7 +757,7 @@ out:
    if (mis->to_src_file) {
        qemu_fclose(mis->to_src_file);
    }
    migration_incoming_exit_colo();
    migration_incoming_disable_colo();

    rcu_unregister_thread();
    return NULL;
+22 −1
Original line number Diff line number Diff line
@@ -296,6 +296,22 @@ int migrate_send_rp_req_pages(MigrationIncomingState *mis, const char *rbname,
    return migrate_send_rp_message(mis, msg_type, msglen, bufc);
}

static bool migration_colo_enabled;
bool migration_incoming_colo_enabled(void)
{
    return migration_colo_enabled;
}

void migration_incoming_disable_colo(void)
{
    migration_colo_enabled = false;
}

void migration_incoming_enable_colo(void)
{
    migration_colo_enabled = true;
}

void qemu_start_incoming_migration(const char *uri, Error **errp)
{
    const char *p;
@@ -418,7 +434,7 @@ static void process_incoming_migration_co(void *opaque)
    }

    /* we get COLO info, and know if we are in COLO mode */
    if (!ret && migration_incoming_enable_colo()) {
    if (!ret && migration_incoming_colo_enabled()) {
        /* Make sure all file formats flush their mutable metadata */
        bdrv_invalidate_cache_all(&local_err);
        if (local_err) {
@@ -3025,6 +3041,11 @@ static void *migration_thread(void *opaque)
        qemu_savevm_send_postcopy_advise(s->to_dst_file);
    }

    if (migrate_colo_enabled()) {
        /* Notify migration destination that we enable COLO */
        qemu_savevm_send_colo_enable(s->to_dst_file);
    }

    qemu_savevm_state_setup(s->to_dst_file);

    s->setup_time = qemu_clock_get_ms(QEMU_CLOCK_HOST) - setup_start;
Loading