mirror of https://gitee.com/openkylin/qemu.git
migration: create global_state.c
It don't belong anywhere else, just the global state where everybody can stick other things. Signed-off-by: Juan Quintela <quintela@redhat.com> Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org> Reviewed-by: Laurent Vivier <lvivier@redhat.com>
This commit is contained in:
parent
2ce3bf1aa9
commit
84a899de8c
|
@ -52,6 +52,7 @@
|
|||
#include <xen/hvm/hvm_info_table.h>
|
||||
#include "hw/xen/xen_pt.h"
|
||||
#endif
|
||||
#include "migration/global_state.h"
|
||||
#include "migration/migration.h"
|
||||
#include "kvm_i386.h"
|
||||
#include "sysemu/numa.h"
|
||||
|
|
|
@ -39,6 +39,7 @@
|
|||
#include "sysemu/hw_accel.h"
|
||||
#include "kvm_ppc.h"
|
||||
#include "migration/migration.h"
|
||||
#include "migration/global_state.h"
|
||||
#include "migration/register.h"
|
||||
#include "mmu-hash64.h"
|
||||
#include "mmu-book3s-v3.h"
|
||||
|
|
|
@ -14,6 +14,7 @@
|
|||
#include "chardev/char.h"
|
||||
#include "sysemu/accel.h"
|
||||
#include "migration/migration.h"
|
||||
#include "migration/global_state.h"
|
||||
|
||||
//#define DEBUG_XEN
|
||||
|
||||
|
|
|
@ -0,0 +1,25 @@
|
|||
/*
|
||||
* Global State configuration
|
||||
*
|
||||
* Copyright (c) 2014-2017 Red Hat Inc
|
||||
*
|
||||
* Authors:
|
||||
* Juan Quintela <quintela@redhat.com>
|
||||
*
|
||||
* This work is licensed under the terms of the GNU GPL, version 2 or later.
|
||||
* See the COPYING file in the top-level directory.
|
||||
*/
|
||||
|
||||
#ifndef QEMU_MIGRATION_GLOBAL_STATE_H
|
||||
#define QEMU_MIGRATION_GLOBAL_STATE_H
|
||||
|
||||
#include "sysemu/sysemu.h"
|
||||
|
||||
void register_global_state(void);
|
||||
void global_state_set_optional(void);
|
||||
int global_state_store(void);
|
||||
void global_state_store_running(void);
|
||||
bool global_state_received(void);
|
||||
RunState global_state_get_runstate(void);
|
||||
|
||||
#endif
|
|
@ -172,10 +172,6 @@ void migrate_send_rp_req_pages(MigrationIncomingState *mis, const char* rbname,
|
|||
ram_addr_t start, size_t len);
|
||||
|
||||
void savevm_skip_section_footers(void);
|
||||
void register_global_state(void);
|
||||
void global_state_set_optional(void);
|
||||
void savevm_skip_configuration(void);
|
||||
int global_state_store(void);
|
||||
void global_state_store_running(void);
|
||||
|
||||
#endif
|
||||
|
|
|
@ -2,7 +2,7 @@ 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 += vmstate.o vmstate-types.o page_cache.o
|
||||
common-obj-y += qemu-file.o
|
||||
common-obj-y += qemu-file.o global_state.o
|
||||
common-obj-y += qemu-file-channel.o
|
||||
common-obj-y += xbzrle.o postcopy-ram.o
|
||||
common-obj-y += qjson.o
|
||||
|
|
|
@ -0,0 +1,140 @@
|
|||
/*
|
||||
* Global State configuration
|
||||
*
|
||||
* Copyright (c) 2014-2017 Red Hat Inc
|
||||
*
|
||||
* Authors:
|
||||
* Juan Quintela <quintela@redhat.com>
|
||||
*
|
||||
* 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 "qemu/cutils.h"
|
||||
#include "qemu/error-report.h"
|
||||
#include "qapi/error.h"
|
||||
#include "qapi/util.h"
|
||||
#include "migration/global_state.h"
|
||||
#include "migration/vmstate.h"
|
||||
#include "sysemu/sysemu.h"
|
||||
#include "trace.h"
|
||||
|
||||
typedef struct {
|
||||
bool optional;
|
||||
uint32_t size;
|
||||
uint8_t runstate[100];
|
||||
RunState state;
|
||||
bool received;
|
||||
} GlobalState;
|
||||
|
||||
static GlobalState global_state;
|
||||
|
||||
int global_state_store(void)
|
||||
{
|
||||
if (!runstate_store((char *)global_state.runstate,
|
||||
sizeof(global_state.runstate))) {
|
||||
error_report("runstate name too big: %s", global_state.runstate);
|
||||
trace_migrate_state_too_big();
|
||||
return -EINVAL;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
void global_state_store_running(void)
|
||||
{
|
||||
const char *state = RunState_lookup[RUN_STATE_RUNNING];
|
||||
strncpy((char *)global_state.runstate,
|
||||
state, sizeof(global_state.runstate));
|
||||
}
|
||||
|
||||
bool global_state_received(void)
|
||||
{
|
||||
return global_state.received;
|
||||
}
|
||||
|
||||
RunState global_state_get_runstate(void)
|
||||
{
|
||||
return global_state.state;
|
||||
}
|
||||
|
||||
void global_state_set_optional(void)
|
||||
{
|
||||
global_state.optional = true;
|
||||
}
|
||||
|
||||
static bool global_state_needed(void *opaque)
|
||||
{
|
||||
GlobalState *s = opaque;
|
||||
char *runstate = (char *)s->runstate;
|
||||
|
||||
/* If it is not optional, it is mandatory */
|
||||
|
||||
if (s->optional == false) {
|
||||
return true;
|
||||
}
|
||||
|
||||
/* If state is running or paused, it is not needed */
|
||||
|
||||
if (strcmp(runstate, "running") == 0 ||
|
||||
strcmp(runstate, "paused") == 0) {
|
||||
return false;
|
||||
}
|
||||
|
||||
/* for any other state it is needed */
|
||||
return true;
|
||||
}
|
||||
|
||||
static int global_state_post_load(void *opaque, int version_id)
|
||||
{
|
||||
GlobalState *s = opaque;
|
||||
Error *local_err = NULL;
|
||||
int r;
|
||||
char *runstate = (char *)s->runstate;
|
||||
|
||||
s->received = true;
|
||||
trace_migrate_global_state_post_load(runstate);
|
||||
|
||||
r = qapi_enum_parse(RunState_lookup, runstate, RUN_STATE__MAX,
|
||||
-1, &local_err);
|
||||
|
||||
if (r == -1) {
|
||||
if (local_err) {
|
||||
error_report_err(local_err);
|
||||
}
|
||||
return -EINVAL;
|
||||
}
|
||||
s->state = r;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void global_state_pre_save(void *opaque)
|
||||
{
|
||||
GlobalState *s = opaque;
|
||||
|
||||
trace_migrate_global_state_pre_save((char *)s->runstate);
|
||||
s->size = strlen((char *)s->runstate) + 1;
|
||||
}
|
||||
|
||||
static const VMStateDescription vmstate_globalstate = {
|
||||
.name = "globalstate",
|
||||
.version_id = 1,
|
||||
.minimum_version_id = 1,
|
||||
.post_load = global_state_post_load,
|
||||
.pre_save = global_state_pre_save,
|
||||
.needed = global_state_needed,
|
||||
.fields = (VMStateField[]) {
|
||||
VMSTATE_UINT32(size, GlobalState),
|
||||
VMSTATE_BUFFER(runstate, GlobalState),
|
||||
VMSTATE_END_OF_LIST()
|
||||
},
|
||||
};
|
||||
|
||||
void register_global_state(void)
|
||||
{
|
||||
/* We would use it independently that we receive it */
|
||||
strcpy((char *)&global_state.runstate, "");
|
||||
global_state.received = false;
|
||||
vmstate_register(NULL, 0, &vmstate_globalstate, &global_state);
|
||||
}
|
|
@ -23,6 +23,7 @@
|
|||
#include "socket.h"
|
||||
#include "rdma.h"
|
||||
#include "ram.h"
|
||||
#include "migration/global_state.h"
|
||||
#include "migration/migration.h"
|
||||
#include "savevm.h"
|
||||
#include "qemu-file-channel.h"
|
||||
|
@ -164,126 +165,6 @@ void migration_incoming_state_destroy(void)
|
|||
qemu_event_destroy(&mis->main_thread_load_event);
|
||||
}
|
||||
|
||||
|
||||
typedef struct {
|
||||
bool optional;
|
||||
uint32_t size;
|
||||
uint8_t runstate[100];
|
||||
RunState state;
|
||||
bool received;
|
||||
} GlobalState;
|
||||
|
||||
static GlobalState global_state;
|
||||
|
||||
int global_state_store(void)
|
||||
{
|
||||
if (!runstate_store((char *)global_state.runstate,
|
||||
sizeof(global_state.runstate))) {
|
||||
error_report("runstate name too big: %s", global_state.runstate);
|
||||
trace_migrate_state_too_big();
|
||||
return -EINVAL;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
void global_state_store_running(void)
|
||||
{
|
||||
const char *state = RunState_lookup[RUN_STATE_RUNNING];
|
||||
strncpy((char *)global_state.runstate,
|
||||
state, sizeof(global_state.runstate));
|
||||
}
|
||||
|
||||
static bool global_state_received(void)
|
||||
{
|
||||
return global_state.received;
|
||||
}
|
||||
|
||||
static RunState global_state_get_runstate(void)
|
||||
{
|
||||
return global_state.state;
|
||||
}
|
||||
|
||||
void global_state_set_optional(void)
|
||||
{
|
||||
global_state.optional = true;
|
||||
}
|
||||
|
||||
static bool global_state_needed(void *opaque)
|
||||
{
|
||||
GlobalState *s = opaque;
|
||||
char *runstate = (char *)s->runstate;
|
||||
|
||||
/* If it is not optional, it is mandatory */
|
||||
|
||||
if (s->optional == false) {
|
||||
return true;
|
||||
}
|
||||
|
||||
/* If state is running or paused, it is not needed */
|
||||
|
||||
if (strcmp(runstate, "running") == 0 ||
|
||||
strcmp(runstate, "paused") == 0) {
|
||||
return false;
|
||||
}
|
||||
|
||||
/* for any other state it is needed */
|
||||
return true;
|
||||
}
|
||||
|
||||
static int global_state_post_load(void *opaque, int version_id)
|
||||
{
|
||||
GlobalState *s = opaque;
|
||||
Error *local_err = NULL;
|
||||
int r;
|
||||
char *runstate = (char *)s->runstate;
|
||||
|
||||
s->received = true;
|
||||
trace_migrate_global_state_post_load(runstate);
|
||||
|
||||
r = qapi_enum_parse(RunState_lookup, runstate, RUN_STATE__MAX,
|
||||
-1, &local_err);
|
||||
|
||||
if (r == -1) {
|
||||
if (local_err) {
|
||||
error_report_err(local_err);
|
||||
}
|
||||
return -EINVAL;
|
||||
}
|
||||
s->state = r;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void global_state_pre_save(void *opaque)
|
||||
{
|
||||
GlobalState *s = opaque;
|
||||
|
||||
trace_migrate_global_state_pre_save((char *)s->runstate);
|
||||
s->size = strlen((char *)s->runstate) + 1;
|
||||
}
|
||||
|
||||
static const VMStateDescription vmstate_globalstate = {
|
||||
.name = "globalstate",
|
||||
.version_id = 1,
|
||||
.minimum_version_id = 1,
|
||||
.post_load = global_state_post_load,
|
||||
.pre_save = global_state_pre_save,
|
||||
.needed = global_state_needed,
|
||||
.fields = (VMStateField[]) {
|
||||
VMSTATE_UINT32(size, GlobalState),
|
||||
VMSTATE_BUFFER(runstate, GlobalState),
|
||||
VMSTATE_END_OF_LIST()
|
||||
},
|
||||
};
|
||||
|
||||
void register_global_state(void)
|
||||
{
|
||||
/* We would use it independently that we receive it */
|
||||
strcpy((char *)&global_state.runstate, "");
|
||||
global_state.received = false;
|
||||
vmstate_register(NULL, 0, &vmstate_globalstate, &global_state);
|
||||
}
|
||||
|
||||
static void migrate_generate_event(int new_state)
|
||||
{
|
||||
if (migrate_use_events()) {
|
||||
|
|
|
@ -38,6 +38,7 @@
|
|||
#include "migration/snapshot.h"
|
||||
#include "migration/misc.h"
|
||||
#include "migration/register.h"
|
||||
#include "migration/global_state.h"
|
||||
#include "ram.h"
|
||||
#include "qemu-file-channel.h"
|
||||
#include "qemu-file.h"
|
||||
|
|
Loading…
Reference in New Issue