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:
parent
df4b102452
commit
13d16814d2
@ -312,6 +312,7 @@ static void pc_compat_2_3(MachineState *machine)
|
||||
if (kvm_enabled()) {
|
||||
pcms->smm = ON_OFF_AUTO_OFF;
|
||||
}
|
||||
global_state_set_optional();
|
||||
}
|
||||
|
||||
static void pc_compat_2_2(MachineState *machine)
|
||||
|
@ -295,6 +295,7 @@ static void pc_compat_2_3(MachineState *machine)
|
||||
if (kvm_enabled()) {
|
||||
pcms->smm = ON_OFF_AUTO_OFF;
|
||||
}
|
||||
global_state_set_optional();
|
||||
}
|
||||
|
||||
static void pc_compat_2_2(MachineState *machine)
|
||||
|
@ -1853,6 +1853,7 @@ static const TypeInfo spapr_machine_info = {
|
||||
static void spapr_compat_2_3(Object *obj)
|
||||
{
|
||||
savevm_skip_section_footers();
|
||||
global_state_set_optional();
|
||||
}
|
||||
|
||||
static void spapr_compat_2_2(Object *obj)
|
||||
|
@ -198,4 +198,5 @@ size_t ram_control_save_page(QEMUFile *f, ram_addr_t block_offset,
|
||||
void ram_mig_init(void);
|
||||
void savevm_skip_section_footers(void);
|
||||
void register_global_state(void);
|
||||
void global_state_set_optional(void);
|
||||
#endif
|
||||
|
@ -100,6 +100,7 @@ void migration_incoming_state_destroy(void)
|
||||
|
||||
|
||||
typedef struct {
|
||||
bool optional;
|
||||
uint32_t size;
|
||||
uint8_t runstate[100];
|
||||
} GlobalState;
|
||||
@ -122,6 +123,33 @@ static char *global_state_get_runstate(void)
|
||||
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)
|
||||
{
|
||||
GlobalState *s = opaque;
|
||||
@ -161,6 +189,7 @@ static const VMStateDescription vmstate_globalstate = {
|
||||
.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),
|
||||
|
Loading…
Reference in New Issue
Block a user