[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH 08/11] migration: create global_state.c
From: |
Laurent Vivier |
Subject: |
Re: [Qemu-devel] [PATCH 08/11] migration: create global_state.c |
Date: |
Mon, 12 Jun 2017 13:45:54 +0200 |
User-agent: |
Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.1.0 |
On 01/06/2017 23:29, Juan Quintela wrote:
> It don't belong anywhere else, just the global state where everybody
> can stick other things.
>
> Signed-off-by: Juan Quintela <address@hidden>
Reviewed-by: Laurent Vivier <address@hidden>
> ---
> hw/i386/pc_piix.c | 1 +
> hw/ppc/spapr.c | 1 +
> hw/xen/xen-common.c | 1 +
> include/migration/global_state.h | 25 +++++++
> include/migration/migration.h | 4 --
> migration/Makefile.objs | 2 +-
> migration/global_state.c | 140
> +++++++++++++++++++++++++++++++++++++++
> migration/migration.c | 121 +--------------------------------
> migration/savevm.c | 1 +
> vl.c | 1 +
> 10 files changed, 172 insertions(+), 125 deletions(-)
> create mode 100644 include/migration/global_state.h
> create mode 100644 migration/global_state.c
>
> diff --git a/hw/i386/pc_piix.c b/hw/i386/pc_piix.c
> index 2234bd0..dc19d96 100644
> --- a/hw/i386/pc_piix.c
> +++ b/hw/i386/pc_piix.c
> @@ -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"
> diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c
> index a44efbf..ac8a317 100644
> --- a/hw/ppc/spapr.c
> +++ b/hw/ppc/spapr.c
> @@ -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"
> diff --git a/hw/xen/xen-common.c b/hw/xen/xen-common.c
> index a9055e9..e265445 100644
> --- a/hw/xen/xen-common.c
> +++ b/hw/xen/xen-common.c
> @@ -14,6 +14,7 @@
> #include "sysemu/char.h"
> #include "sysemu/accel.h"
> #include "migration/migration.h"
> +#include "migration/global_state.h"
>
> //#define DEBUG_XEN
>
> diff --git a/include/migration/global_state.h
> b/include/migration/global_state.h
> new file mode 100644
> index 0000000..90faea7
> --- /dev/null
> +++ b/include/migration/global_state.h
> @@ -0,0 +1,25 @@
> +/*
> + * Global State configuration
> + *
> + * Copyright (c) 2014-2017 Red Hat Inc
> + *
> + * Authors:
> + * Juan Quintela <address@hidden>
> + *
> + * 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
> diff --git a/include/migration/migration.h b/include/migration/migration.h
> index cb894b8..5050454 100644
> --- a/include/migration/migration.h
> +++ b/include/migration/migration.h
> @@ -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
> diff --git a/migration/Makefile.objs b/migration/Makefile.objs
> index 90f8c1f..1c7770d 100644
> --- a/migration/Makefile.objs
> +++ b/migration/Makefile.objs
> @@ -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
> diff --git a/migration/global_state.c b/migration/global_state.c
> new file mode 100644
> index 0000000..16ac63f
> --- /dev/null
> +++ b/migration/global_state.c
> @@ -0,0 +1,140 @@
> +/*
> + * Global State configuration
> + *
> + * Copyright (c) 2014-2017 Red Hat Inc
> + *
> + * Authors:
> + * Juan Quintela <address@hidden>
> + *
> + * 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);
> +}
> diff --git a/migration/migration.c b/migration/migration.c
> index 603d39d..6a7620b 100644
> --- a/migration/migration.c
> +++ b/migration/migration.c
> @@ -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()) {
> diff --git a/migration/savevm.c b/migration/savevm.c
> index 543635b..265e908 100644
> --- a/migration/savevm.c
> +++ b/migration/savevm.c
> @@ -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"
> diff --git a/vl.c b/vl.c
> index 80b86c0..bf9aa6a 100644
> --- a/vl.c
> +++ b/vl.c
> @@ -88,6 +88,7 @@ int main(int argc, char **argv)
> #include "hw/block/block.h"
> #include "migration/misc.h"
> #include "migration/snapshot.h"
> +#include "migration/global_state.h"
> #include "sysemu/tpm.h"
> #include "sysemu/dma.h"
> #include "hw/audio/soundhw.h"
>
- [Qemu-devel] [PATCH 04/11] migration: Move dump_vmsate_json_to_file() to misc.h, (continued)
- [Qemu-devel] [PATCH 04/11] migration: Move dump_vmsate_json_to_file() to misc.h, Juan Quintela, 2017/06/01
- [Qemu-devel] [PATCH 05/11] migration: Move constants to savevm.h, Juan Quintela, 2017/06/01
- [Qemu-devel] [PATCH 06/11] migration: Commands are only used inside migration.c, Juan Quintela, 2017/06/01
- [Qemu-devel] [PATCH 07/11] migration: ram_control_* are implemented in qemu_file, Juan Quintela, 2017/06/01
- [Qemu-devel] [PATCH 08/11] migration: create global_state.c, Juan Quintela, 2017/06/01
- Re: [Qemu-devel] [PATCH 08/11] migration: create global_state.c,
Laurent Vivier <=
- [Qemu-devel] [PATCH 09/11] migration: Move remaining exported functions to migration/misc.h, Juan Quintela, 2017/06/01
- [Qemu-devel] [PATCH 10/11] migration: Move migration.h to migration/, Juan Quintela, 2017/06/01
- [Qemu-devel] [PATCH 11/11] migration: Remove unneeded includes, Juan Quintela, 2017/06/01
- Re: [Qemu-devel] [PATCH 00/11] Misc migration cleanups, Philippe Mathieu-Daudé, 2017/06/02