Message ID | 9c7292fe59f31cc3296c15a5b693867fbabe9fad.1438605827.git.amit.shah@redhat.com |
---|---|
State | New |
Headers | show |
* Amit Shah (amit.shah@redhat.com) wrote: > From: Anthony PERARD <anthony.perard@gmail.com> > > When doing migration via the QMP command xen_save_devices_state, the > current runstate is not store into the global state section. Also the > current runstate is not the one we want on the receiver side. > > During migration, the Xen toolstack paused QEMU before save the devices > state. Also, the toolstack expect QEMU to autostart when the migration is > finished. > So this patch store "running" as it's current runstate. > > Signed-off-by: Anthony PERARD <anthony.perard@citrix.com> > Message-Id: <1438098885-4339-3-git-send-email-anthony.perard@citrix.com> > Signed-off-by: Amit Shah <amit.shah@redhat.com> > --- > include/migration/migration.h | 1 + > migration/migration.c | 7 +++++++ > migration/savevm.c | 1 + > 3 files changed, 9 insertions(+) > > diff --git a/include/migration/migration.h b/include/migration/migration.h > index a2f8ed0..8334621 100644 > --- a/include/migration/migration.h > +++ b/include/migration/migration.h > @@ -203,4 +203,5 @@ 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/migration.c b/migration/migration.c > index fd4f99b..175a397 100644 > --- a/migration/migration.c > +++ b/migration/migration.c > @@ -122,6 +122,13 @@ int global_state_store(void) > return 0; > } > > +void global_state_store_running(void) > +{ > + const char *state = RunState_lookup[RUN_STATE_RUNNING]; > + memcpy((char *)global_state.runstate, > + state, sizeof(global_state.runstate)); > +} As mentioned previously, I think that needs to be a strcpy, NOT a memcpy; the RuNState_lookup[] array isn't guaranteed to be long enough to fulfill that memcpy. Dave > + > static bool global_state_received(void) > { > return global_state.received; > diff --git a/migration/savevm.c b/migration/savevm.c > index 81dbe58..6071215 100644 > --- a/migration/savevm.c > +++ b/migration/savevm.c > @@ -1394,6 +1394,7 @@ void qmp_xen_save_devices_state(const char *filename, Error **errp) > > saved_vm_running = runstate_is_running(); > vm_stop(RUN_STATE_SAVE_VM); > + global_state_store_running(); > > f = qemu_fopen(filename, "wb"); > if (!f) { > -- > 2.4.3 > > -- Dr. David Alan Gilbert / dgilbert@redhat.com / Manchester, UK
diff --git a/include/migration/migration.h b/include/migration/migration.h index a2f8ed0..8334621 100644 --- a/include/migration/migration.h +++ b/include/migration/migration.h @@ -203,4 +203,5 @@ 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/migration.c b/migration/migration.c index fd4f99b..175a397 100644 --- a/migration/migration.c +++ b/migration/migration.c @@ -122,6 +122,13 @@ int global_state_store(void) return 0; } +void global_state_store_running(void) +{ + const char *state = RunState_lookup[RUN_STATE_RUNNING]; + memcpy((char *)global_state.runstate, + state, sizeof(global_state.runstate)); +} + static bool global_state_received(void) { return global_state.received; diff --git a/migration/savevm.c b/migration/savevm.c index 81dbe58..6071215 100644 --- a/migration/savevm.c +++ b/migration/savevm.c @@ -1394,6 +1394,7 @@ void qmp_xen_save_devices_state(const char *filename, Error **errp) saved_vm_running = runstate_is_running(); vm_stop(RUN_STATE_SAVE_VM); + global_state_store_running(); f = qemu_fopen(filename, "wb"); if (!f) {