* [Qemu-devel] [PATCH 0/2] Fix global state with savevm
@ 2015-07-10 12:58 Juan Quintela
2015-07-10 12:58 ` [Qemu-devel] [PATCH 1/2] migration: Register global state section before loadvm Juan Quintela
` (2 more replies)
0 siblings, 3 replies; 6+ messages in thread
From: Juan Quintela @ 2015-07-10 12:58 UTC (permalink / raw)
To: qemu-devel; +Cc: amit.shah, dgilbert
Hi
Store global state for both savevm & migration in a single place.
Register globalstate save handler before loadvm happens.
Please, review.
Juan Quintela (2):
migration: Register global state section before loadvm
migration: store globalstate in pre_safe
migration/migration.c | 30 ++++++++++++------------------
vl.c | 2 +-
2 files changed, 13 insertions(+), 19 deletions(-)
--
2.4.3
^ permalink raw reply [flat|nested] 6+ messages in thread
* [Qemu-devel] [PATCH 1/2] migration: Register global state section before loadvm
2015-07-10 12:58 [Qemu-devel] [PATCH 0/2] Fix global state with savevm Juan Quintela
@ 2015-07-10 12:58 ` Juan Quintela
2015-07-10 12:58 ` [Qemu-devel] [PATCH 2/2] migration: store globalstate in pre_safe Juan Quintela
2015-07-10 13:21 ` [Qemu-devel] [PATCH 0/2] Fix global state with savevm Christian Borntraeger
2 siblings, 0 replies; 6+ messages in thread
From: Juan Quintela @ 2015-07-10 12:58 UTC (permalink / raw)
To: qemu-devel; +Cc: amit.shah, dgilbert
Otherwise, it is not found
Signed-off-by: Juan Quintela <quintela@redhat.com>
---
vl.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/vl.c b/vl.c
index 3f269dc..5856396 100644
--- a/vl.c
+++ b/vl.c
@@ -4615,6 +4615,7 @@ int main(int argc, char **argv, char **envp)
}
qemu_system_reset(VMRESET_SILENT);
+ register_global_state();
if (loadvm) {
if (load_vmstate(loadvm) < 0) {
autostart = 0;
@@ -4628,7 +4629,6 @@ int main(int argc, char **argv, char **envp)
return 0;
}
- register_global_state();
if (incoming) {
Error *local_err = NULL;
qemu_start_incoming_migration(incoming, &local_err);
--
2.4.3
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [Qemu-devel] [PATCH 2/2] migration: store globalstate in pre_safe
2015-07-10 12:58 [Qemu-devel] [PATCH 0/2] Fix global state with savevm Juan Quintela
2015-07-10 12:58 ` [Qemu-devel] [PATCH 1/2] migration: Register global state section before loadvm Juan Quintela
@ 2015-07-10 12:58 ` Juan Quintela
2015-07-10 14:29 ` Dr. David Alan Gilbert
2015-07-10 13:21 ` [Qemu-devel] [PATCH 0/2] Fix global state with savevm Christian Borntraeger
2 siblings, 1 reply; 6+ messages in thread
From: Juan Quintela @ 2015-07-10 12:58 UTC (permalink / raw)
To: qemu-devel; +Cc: amit.shah, dgilbert
We use global state in both savevm & migration. The easiest way is to
put the setup in a single place.
Signed-off-by: Juan Quintela <quintela@redhat.com>
---
migration/migration.c | 30 ++++++++++++------------------
1 file changed, 12 insertions(+), 18 deletions(-)
diff --git a/migration/migration.c b/migration/migration.c
index ba82ff6..d1421fe 100644
--- a/migration/migration.c
+++ b/migration/migration.c
@@ -110,17 +110,6 @@ typedef struct {
static GlobalState global_state;
-static 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;
-}
-
static bool global_state_received(void)
{
return global_state.received;
@@ -187,6 +176,14 @@ static void global_state_pre_save(void *opaque)
GlobalState *s = opaque;
trace_migrate_global_state_pre_save((char *)s->runstate);
+
+ 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();
+ exit(EXIT_FAILURE);
+ }
+
s->size = strlen((char *)s->runstate) + 1;
}
@@ -940,13 +937,10 @@ static void *migration_thread(void *opaque)
qemu_system_wakeup_request(QEMU_WAKEUP_REASON_OTHER);
old_vm_running = runstate_is_running();
- ret = global_state_store();
- if (!ret) {
- ret = vm_stop_force_state(RUN_STATE_FINISH_MIGRATE);
- if (ret >= 0) {
- qemu_file_set_rate_limit(s->file, INT64_MAX);
- qemu_savevm_state_complete(s->file);
- }
+ ret = vm_stop_force_state(RUN_STATE_FINISH_MIGRATE);
+ if (ret >= 0) {
+ qemu_file_set_rate_limit(s->file, INT64_MAX);
+ qemu_savevm_state_complete(s->file);
}
qemu_mutex_unlock_iothread();
--
2.4.3
^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [Qemu-devel] [PATCH 0/2] Fix global state with savevm
2015-07-10 12:58 [Qemu-devel] [PATCH 0/2] Fix global state with savevm Juan Quintela
2015-07-10 12:58 ` [Qemu-devel] [PATCH 1/2] migration: Register global state section before loadvm Juan Quintela
2015-07-10 12:58 ` [Qemu-devel] [PATCH 2/2] migration: store globalstate in pre_safe Juan Quintela
@ 2015-07-10 13:21 ` Christian Borntraeger
2 siblings, 0 replies; 6+ messages in thread
From: Christian Borntraeger @ 2015-07-10 13:21 UTC (permalink / raw)
To: Juan Quintela, qemu-devel; +Cc: amit.shah, dgilbert
Am 10.07.2015 um 14:58 schrieb Juan Quintela:
> Hi
>
> Store global state for both savevm & migration in a single place.
> Register globalstate save handler before loadvm happens.
>
> Please, review.
>
> Juan Quintela (2):
> migration: Register global state section before loadvm
> migration: store globalstate in pre_safe
>
> migration/migration.c | 30 ++++++++++++------------------
> vl.c | 2 +-
> 2 files changed, 13 insertions(+), 19 deletions(-)
>
Patch 2 does not seem to fit on 2.4.0-rc0 without fixing up a bit.
I fixed up but a 2.4.0-rc0 + patches managesave/start on s390 gives me
ERROR: invalid runstate transition: 'inmigrate' -> 'finish-migrate'
Christian
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [Qemu-devel] [PATCH 2/2] migration: store globalstate in pre_safe
2015-07-10 12:58 ` [Qemu-devel] [PATCH 2/2] migration: store globalstate in pre_safe Juan Quintela
@ 2015-07-10 14:29 ` Dr. David Alan Gilbert
2015-07-13 8:06 ` Juan Quintela
0 siblings, 1 reply; 6+ messages in thread
From: Dr. David Alan Gilbert @ 2015-07-10 14:29 UTC (permalink / raw)
To: Juan Quintela; +Cc: amit.shah, borntraeger, qemu-devel
* Juan Quintela (quintela@redhat.com) wrote:
> We use global state in both savevm & migration. The easiest way is to
> put the setup in a single place.
>
> Signed-off-by: Juan Quintela <quintela@redhat.com>
I don't think this works; I think pre-save is called after the migration
code has changed the runstate, so you end up saving the wrong runstate,
and that explains the error Christian sees.
Dave
> ---
> migration/migration.c | 30 ++++++++++++------------------
> 1 file changed, 12 insertions(+), 18 deletions(-)
>
> diff --git a/migration/migration.c b/migration/migration.c
> index ba82ff6..d1421fe 100644
> --- a/migration/migration.c
> +++ b/migration/migration.c
> @@ -110,17 +110,6 @@ typedef struct {
>
> static GlobalState global_state;
>
> -static 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;
> -}
> -
> static bool global_state_received(void)
> {
> return global_state.received;
> @@ -187,6 +176,14 @@ static void global_state_pre_save(void *opaque)
> GlobalState *s = opaque;
>
> trace_migrate_global_state_pre_save((char *)s->runstate);
> +
> + 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();
> + exit(EXIT_FAILURE);
> + }
> +
> s->size = strlen((char *)s->runstate) + 1;
> }
>
> @@ -940,13 +937,10 @@ static void *migration_thread(void *opaque)
> qemu_system_wakeup_request(QEMU_WAKEUP_REASON_OTHER);
> old_vm_running = runstate_is_running();
>
> - ret = global_state_store();
> - if (!ret) {
> - ret = vm_stop_force_state(RUN_STATE_FINISH_MIGRATE);
> - if (ret >= 0) {
> - qemu_file_set_rate_limit(s->file, INT64_MAX);
> - qemu_savevm_state_complete(s->file);
> - }
> + ret = vm_stop_force_state(RUN_STATE_FINISH_MIGRATE);
> + if (ret >= 0) {
> + qemu_file_set_rate_limit(s->file, INT64_MAX);
> + qemu_savevm_state_complete(s->file);
> }
> qemu_mutex_unlock_iothread();
>
> --
> 2.4.3
>
--
Dr. David Alan Gilbert / dgilbert@redhat.com / Manchester, UK
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [Qemu-devel] [PATCH 2/2] migration: store globalstate in pre_safe
2015-07-10 14:29 ` Dr. David Alan Gilbert
@ 2015-07-13 8:06 ` Juan Quintela
0 siblings, 0 replies; 6+ messages in thread
From: Juan Quintela @ 2015-07-13 8:06 UTC (permalink / raw)
To: Dr. David Alan Gilbert; +Cc: amit.shah, borntraeger, qemu-devel
"Dr. David Alan Gilbert" <dgilbert@redhat.com> wrote:
> * Juan Quintela (quintela@redhat.com) wrote:
>> We use global state in both savevm & migration. The easiest way is to
>> put the setup in a single place.
>>
>> Signed-off-by: Juan Quintela <quintela@redhat.com>
>
> I don't think this works; I think pre-save is called after the migration
> code has changed the runstate, so you end up saving the wrong runstate,
> and that explains the error Christian sees.
Grrrr, it works for savevm. Just to make clear how things went
completely wrong:
I add this code to global_state_pre_save with a guard of:
if (strcmp(global_State_runstate, "") != 0) {
}
And it worked for savevm. So, if it works for savevm, it will also work
for migration, right? Code paths are almost identical. And have the
code in a single place.
It appears that answer was not.
Sorry, Juan.
Adding back to both places.
>
> Dave
>
>> ---
>> migration/migration.c | 30 ++++++++++++------------------
>> 1 file changed, 12 insertions(+), 18 deletions(-)
>>
>> diff --git a/migration/migration.c b/migration/migration.c
>> index ba82ff6..d1421fe 100644
>> --- a/migration/migration.c
>> +++ b/migration/migration.c
>> @@ -110,17 +110,6 @@ typedef struct {
>>
>> static GlobalState global_state;
>>
>> -static 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;
>> -}
>> -
>> static bool global_state_received(void)
>> {
>> return global_state.received;
>> @@ -187,6 +176,14 @@ static void global_state_pre_save(void *opaque)
>> GlobalState *s = opaque;
>>
>> trace_migrate_global_state_pre_save((char *)s->runstate);
>> +
>> + 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();
>> + exit(EXIT_FAILURE);
>> + }
>> +
>> s->size = strlen((char *)s->runstate) + 1;
>> }
>>
>> @@ -940,13 +937,10 @@ static void *migration_thread(void *opaque)
>> qemu_system_wakeup_request(QEMU_WAKEUP_REASON_OTHER);
>> old_vm_running = runstate_is_running();
>>
>> - ret = global_state_store();
>> - if (!ret) {
>> - ret = vm_stop_force_state(RUN_STATE_FINISH_MIGRATE);
>> - if (ret >= 0) {
>> - qemu_file_set_rate_limit(s->file, INT64_MAX);
>> - qemu_savevm_state_complete(s->file);
>> - }
>> + ret = vm_stop_force_state(RUN_STATE_FINISH_MIGRATE);
>> + if (ret >= 0) {
>> + qemu_file_set_rate_limit(s->file, INT64_MAX);
>> + qemu_savevm_state_complete(s->file);
>> }
>> qemu_mutex_unlock_iothread();
>>
>> --
>> 2.4.3
>>
> --
> Dr. David Alan Gilbert / dgilbert@redhat.com / Manchester, UK
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2015-07-13 8:06 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2015-07-10 12:58 [Qemu-devel] [PATCH 0/2] Fix global state with savevm Juan Quintela
2015-07-10 12:58 ` [Qemu-devel] [PATCH 1/2] migration: Register global state section before loadvm Juan Quintela
2015-07-10 12:58 ` [Qemu-devel] [PATCH 2/2] migration: store globalstate in pre_safe Juan Quintela
2015-07-10 14:29 ` Dr. David Alan Gilbert
2015-07-13 8:06 ` Juan Quintela
2015-07-10 13:21 ` [Qemu-devel] [PATCH 0/2] Fix global state with savevm Christian Borntraeger
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).