global_state: Make section optional

This section would be sent:

a- for all new machine types
b- for old machine types if section state is different form {running,paused}
   that were the only giving us troubles.

So, in new qemus: it is alwasy there.  In old qemus: they are only
there if it an error has happened, basically stoping on target.

Signed-off-by: Juan Quintela <quintela@redhat.com>
Reviewed-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
This commit is contained in:
Juan Quintela 2014-10-08 13:58:24 +02:00
parent df4b102452
commit 13d16814d2
5 changed files with 33 additions and 0 deletions

View File

@ -312,6 +312,7 @@ static void pc_compat_2_3(MachineState *machine)
if (kvm_enabled()) { if (kvm_enabled()) {
pcms->smm = ON_OFF_AUTO_OFF; pcms->smm = ON_OFF_AUTO_OFF;
} }
global_state_set_optional();
} }
static void pc_compat_2_2(MachineState *machine) static void pc_compat_2_2(MachineState *machine)

View File

@ -295,6 +295,7 @@ static void pc_compat_2_3(MachineState *machine)
if (kvm_enabled()) { if (kvm_enabled()) {
pcms->smm = ON_OFF_AUTO_OFF; pcms->smm = ON_OFF_AUTO_OFF;
} }
global_state_set_optional();
} }
static void pc_compat_2_2(MachineState *machine) static void pc_compat_2_2(MachineState *machine)

View File

@ -1853,6 +1853,7 @@ static const TypeInfo spapr_machine_info = {
static void spapr_compat_2_3(Object *obj) static void spapr_compat_2_3(Object *obj)
{ {
savevm_skip_section_footers(); savevm_skip_section_footers();
global_state_set_optional();
} }
static void spapr_compat_2_2(Object *obj) static void spapr_compat_2_2(Object *obj)

View File

@ -198,4 +198,5 @@ size_t ram_control_save_page(QEMUFile *f, ram_addr_t block_offset,
void ram_mig_init(void); void ram_mig_init(void);
void savevm_skip_section_footers(void); void savevm_skip_section_footers(void);
void register_global_state(void); void register_global_state(void);
void global_state_set_optional(void);
#endif #endif

View File

@ -100,6 +100,7 @@ void migration_incoming_state_destroy(void)
typedef struct { typedef struct {
bool optional;
uint32_t size; uint32_t size;
uint8_t runstate[100]; uint8_t runstate[100];
} GlobalState; } GlobalState;
@ -122,6 +123,33 @@ static char *global_state_get_runstate(void)
return (char *)global_state.runstate; return (char *)global_state.runstate;
} }
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) static int global_state_post_load(void *opaque, int version_id)
{ {
GlobalState *s = opaque; GlobalState *s = opaque;
@ -161,6 +189,7 @@ static const VMStateDescription vmstate_globalstate = {
.minimum_version_id = 1, .minimum_version_id = 1,
.post_load = global_state_post_load, .post_load = global_state_post_load,
.pre_save = global_state_pre_save, .pre_save = global_state_pre_save,
.needed = global_state_needed,
.fields = (VMStateField[]) { .fields = (VMStateField[]) {
VMSTATE_UINT32(size, GlobalState), VMSTATE_UINT32(size, GlobalState),
VMSTATE_BUFFER(runstate, GlobalState), VMSTATE_BUFFER(runstate, GlobalState),