mirror of
https://github.com/xemu-project/xemu.git
synced 2024-11-23 19:49:43 +00:00
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: zhanghailiang <zhang.zhanghailiang@huawei.com> Signed-off-by: Zhang Chen <zhangckid@gmail.com> Signed-off-by: Zhang Chen <chen.zhang@intel.com> Reviewed-by: Dr. David Alan Gilbert <dgilbert@redhat.com> Signed-off-by: Jason Wang <jasowang@redhat.com>
This commit is contained in:
parent
8e48ac9586
commit
aad555c229
@ -28,8 +28,9 @@ void migrate_start_colo_process(MigrationState *s);
|
|||||||
bool migration_in_colo_state(void);
|
bool migration_in_colo_state(void);
|
||||||
|
|
||||||
/* loadvm */
|
/* loadvm */
|
||||||
bool migration_incoming_enable_colo(void);
|
void migration_incoming_enable_colo(void);
|
||||||
void migration_incoming_exit_colo(void);
|
void migration_incoming_disable_colo(void);
|
||||||
|
bool migration_incoming_colo_enabled(void);
|
||||||
void *colo_process_incoming_thread(void *opaque);
|
void *colo_process_incoming_thread(void *opaque);
|
||||||
bool migration_incoming_in_colo_state(void);
|
bool migration_incoming_in_colo_state(void);
|
||||||
|
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
common-obj-y += migration.o socket.o fd.o exec.o
|
common-obj-y += migration.o socket.o fd.o exec.o
|
||||||
common-obj-y += tls.o channel.o savevm.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 += vmstate.o vmstate-types.o page_cache.o
|
||||||
common-obj-y += qemu-file.o global_state.o
|
common-obj-y += qemu-file.o global_state.o
|
||||||
common-obj-y += qemu-file-channel.o
|
common-obj-y += qemu-file-channel.o
|
||||||
|
@ -1,76 +0,0 @@
|
|||||||
/*
|
|
||||||
* 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;
|
|
||||||
}
|
|
@ -152,6 +152,17 @@ static void primary_vm_do_failover(void)
|
|||||||
qemu_sem_post(&s->colo_exit_sem);
|
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)
|
void colo_do_failover(MigrationState *s)
|
||||||
{
|
{
|
||||||
/* Make sure VM stopped while failover happened. */
|
/* Make sure VM stopped while failover happened. */
|
||||||
@ -746,7 +757,7 @@ out:
|
|||||||
if (mis->to_src_file) {
|
if (mis->to_src_file) {
|
||||||
qemu_fclose(mis->to_src_file);
|
qemu_fclose(mis->to_src_file);
|
||||||
}
|
}
|
||||||
migration_incoming_exit_colo();
|
migration_incoming_disable_colo();
|
||||||
|
|
||||||
rcu_unregister_thread();
|
rcu_unregister_thread();
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -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);
|
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)
|
void qemu_start_incoming_migration(const char *uri, Error **errp)
|
||||||
{
|
{
|
||||||
const char *p;
|
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 */
|
/* 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 */
|
/* Make sure all file formats flush their mutable metadata */
|
||||||
bdrv_invalidate_cache_all(&local_err);
|
bdrv_invalidate_cache_all(&local_err);
|
||||||
if (local_err) {
|
if (local_err) {
|
||||||
@ -3025,6 +3041,11 @@ static void *migration_thread(void *opaque)
|
|||||||
qemu_savevm_send_postcopy_advise(s->to_dst_file);
|
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);
|
qemu_savevm_state_setup(s->to_dst_file);
|
||||||
|
|
||||||
s->setup_time = qemu_clock_get_ms(QEMU_CLOCK_HOST) - setup_start;
|
s->setup_time = qemu_clock_get_ms(QEMU_CLOCK_HOST) - setup_start;
|
||||||
|
@ -56,6 +56,7 @@
|
|||||||
#include "io/channel-file.h"
|
#include "io/channel-file.h"
|
||||||
#include "sysemu/replay.h"
|
#include "sysemu/replay.h"
|
||||||
#include "qjson.h"
|
#include "qjson.h"
|
||||||
|
#include "migration/colo.h"
|
||||||
|
|
||||||
#ifndef ETH_P_RARP
|
#ifndef ETH_P_RARP
|
||||||
#define ETH_P_RARP 0x8035
|
#define ETH_P_RARP 0x8035
|
||||||
@ -82,6 +83,7 @@ enum qemu_vm_cmd {
|
|||||||
were previously sent during
|
were previously sent during
|
||||||
precopy but are dirty. */
|
precopy but are dirty. */
|
||||||
MIG_CMD_PACKAGED, /* Send a wrapped stream within this stream */
|
MIG_CMD_PACKAGED, /* Send a wrapped stream within this stream */
|
||||||
|
MIG_CMD_ENABLE_COLO, /* Enable COLO */
|
||||||
MIG_CMD_POSTCOPY_RESUME, /* resume postcopy on dest */
|
MIG_CMD_POSTCOPY_RESUME, /* resume postcopy on dest */
|
||||||
MIG_CMD_RECV_BITMAP, /* Request for recved bitmap on dst */
|
MIG_CMD_RECV_BITMAP, /* Request for recved bitmap on dst */
|
||||||
MIG_CMD_MAX
|
MIG_CMD_MAX
|
||||||
@ -841,6 +843,12 @@ static void qemu_savevm_command_send(QEMUFile *f,
|
|||||||
qemu_fflush(f);
|
qemu_fflush(f);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void qemu_savevm_send_colo_enable(QEMUFile *f)
|
||||||
|
{
|
||||||
|
trace_savevm_send_colo_enable();
|
||||||
|
qemu_savevm_command_send(f, MIG_CMD_ENABLE_COLO, 0, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
void qemu_savevm_send_ping(QEMUFile *f, uint32_t value)
|
void qemu_savevm_send_ping(QEMUFile *f, uint32_t value)
|
||||||
{
|
{
|
||||||
uint32_t buf;
|
uint32_t buf;
|
||||||
@ -1922,6 +1930,12 @@ static int loadvm_handle_recv_bitmap(MigrationIncomingState *mis,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int loadvm_process_enable_colo(MigrationIncomingState *mis)
|
||||||
|
{
|
||||||
|
migration_incoming_enable_colo();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Process an incoming 'QEMU_VM_COMMAND'
|
* Process an incoming 'QEMU_VM_COMMAND'
|
||||||
* 0 just a normal return
|
* 0 just a normal return
|
||||||
@ -2001,6 +2015,9 @@ static int loadvm_process_command(QEMUFile *f)
|
|||||||
|
|
||||||
case MIG_CMD_RECV_BITMAP:
|
case MIG_CMD_RECV_BITMAP:
|
||||||
return loadvm_handle_recv_bitmap(mis, len);
|
return loadvm_handle_recv_bitmap(mis, len);
|
||||||
|
|
||||||
|
case MIG_CMD_ENABLE_COLO:
|
||||||
|
return loadvm_process_enable_colo(mis);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -55,6 +55,7 @@ void qemu_savevm_send_postcopy_ram_discard(QEMUFile *f, const char *name,
|
|||||||
uint16_t len,
|
uint16_t len,
|
||||||
uint64_t *start_list,
|
uint64_t *start_list,
|
||||||
uint64_t *length_list);
|
uint64_t *length_list);
|
||||||
|
void qemu_savevm_send_colo_enable(QEMUFile *f);
|
||||||
|
|
||||||
int qemu_loadvm_state(QEMUFile *f);
|
int qemu_loadvm_state(QEMUFile *f);
|
||||||
void qemu_loadvm_state_cleanup(void);
|
void qemu_loadvm_state_cleanup(void);
|
||||||
|
@ -37,6 +37,7 @@ savevm_send_ping(uint32_t val) "0x%x"
|
|||||||
savevm_send_postcopy_listen(void) ""
|
savevm_send_postcopy_listen(void) ""
|
||||||
savevm_send_postcopy_run(void) ""
|
savevm_send_postcopy_run(void) ""
|
||||||
savevm_send_postcopy_resume(void) ""
|
savevm_send_postcopy_resume(void) ""
|
||||||
|
savevm_send_colo_enable(void) ""
|
||||||
savevm_send_recv_bitmap(char *name) "%s"
|
savevm_send_recv_bitmap(char *name) "%s"
|
||||||
savevm_state_setup(void) ""
|
savevm_state_setup(void) ""
|
||||||
savevm_state_resume_prepare(void) ""
|
savevm_state_resume_prepare(void) ""
|
||||||
|
Loading…
Reference in New Issue
Block a user