Fabiano Rosas <[email protected]> writes:

> Peter Xu <[email protected]> writes:
>
>> Migration notifiers will notify at any of three places: (1) SETUP
>> phase, (2) migration completes, (3) migration fails.
>>
>> There's actually a special case for spice: one can refer to
>> b82fc321bf ("Postcopy+spice: Pass spice migration data earlier").  It
>> doesn't need another 4th event because in commit 9d9babf78d ("migration:
>> MigrationEvent for notifiers") we merged it together with the DONE event.
>>
>> The merge makes some sense if we treat "switchover" of postcopy as "DONE",
>> however that also means for postcopy we'll notify DONE twice..  The other
>> one at the end of postcopy when migration_cleanup().
>>
>> In reality, the current code base will also notify FAILED for postcopy
>> twice.  It's because an (maybe accidental) change in commit
>> 4af667f87c ("migration: notifier error checking").
>>
>> First of all, we still need that notification when switchover as stated in
>> Dave's commit, however that's only needed for spice.  To fix it, introduce
>> POSTCOPY_START event to differenciate it from DONE.  Use that instead in
>> postcopy_start().  Then spice will need to capture this event too.
>>
>> Then we remove the extra FAILED notification in postcopy_start().
>>
>> If one wonder if other DONE users should also monitor POSTCOPY_START
>> event.. We have two more DONE users:
>>
>>   - kvm_arm_gicv3_notifier
>>   - cpr_exec_notifier
>>
>> Both of them do not need a notification for POSTCOPY_START, but only when
>> migration completed.  Actually, both of them are used in CPR, which doesn't
>> support postcopy.
>>
>> I didn't attach Fixes: because I am not aware of any real bug on such
>> double reporting.  I'm wildly guessing the 2nd notify might be silently
>> ignored in many cases.  However this is still worth fixing.
>>
>> Cc: Marc-AndrĂ© Lureau <[email protected]>
>> Cc: Dr. David Alan Gilbert <[email protected]>
>> Signed-off-by: Peter Xu <[email protected]>
>> ---
>>  include/migration/misc.h | 1 +
>>  migration/migration.c    | 3 +--
>>  ui/spice-core.c          | 3 ++-
>>  3 files changed, 4 insertions(+), 3 deletions(-)
>>
>> diff --git a/include/migration/misc.h b/include/migration/misc.h
>> index e26d418a6e..b002466e10 100644
>> --- a/include/migration/misc.h
>> +++ b/include/migration/misc.h
>> @@ -63,6 +63,7 @@ typedef enum MigrationEventType {
>>      MIG_EVENT_PRECOPY_SETUP,
>>      MIG_EVENT_PRECOPY_DONE,
>>      MIG_EVENT_PRECOPY_FAILED,
>> +    MIG_EVENT_POSTCOPY_START,
>>      MIG_EVENT_MAX
>>  } MigrationEventType;
>
> With the new state there's a doc text to update at
> migration_add_notifier below.
>
>>  
>> diff --git a/migration/migration.c b/migration/migration.c
>> index 47d9189aaf..91775f8472 100644
>> --- a/migration/migration.c
>> +++ b/migration/migration.c
>> @@ -2857,7 +2857,7 @@ static int postcopy_start(MigrationState *ms, Error 
>> **errp)
>>       * at the transition to postcopy and after the device state; in 
>> particular
>>       * spice needs to trigger a transition now
>>       */
>> -    migration_call_notifiers(ms, MIG_EVENT_PRECOPY_DONE, NULL);
>> +    migration_call_notifiers(ms, MIG_EVENT_POSTCOPY_START, NULL);
>>  
>>      migration_downtime_end(ms);
>>  
>> @@ -2906,7 +2906,6 @@ fail:
>>          migrate_set_state(&ms->state, ms->state, MIGRATION_STATUS_FAILED);
>>      }
>>      migration_block_activate(NULL);
>> -    migration_call_notifiers(ms, MIG_EVENT_PRECOPY_FAILED, NULL);
>
> Does anything consuming the FAILED event expects it to be issued before
> the vm_start() at migration_iteration_finish?
>
> migration_iteration_finish:
>
> bql_lock();
> switch (s->state) {
> case MIGRATION_STATUS_FAILED:
>     if (!migration_block_activate(&local_err)) {
>         error_free(local_err);
>         break;
>     }
>     if (runstate_is_live(s->vm_old_state)) {
>         if (!runstate_check(RUN_STATE_SHUTDOWN)) {
>             vm_start();
>         }
>     } else {
>         if (runstate_check(RUN_STATE_FINISH_MIGRATE)) {
>             runstate_set(s->vm_old_state);
>         }
>     }
>
> The extra migration_block_activate() in postcopy_start() also seems
> wrong, no?
>

Heh, nevermind...

>>      bql_unlock();
>>      return -1;
>>  }
>> diff --git a/ui/spice-core.c b/ui/spice-core.c
>> index 8a6050f4ae..ce3c2954e3 100644
>> --- a/ui/spice-core.c
>> +++ b/ui/spice-core.c
>> @@ -585,7 +585,8 @@ static int migration_state_notifier(NotifierWithReturn 
>> *notifier,
>>  
>>      if (e->type == MIG_EVENT_PRECOPY_SETUP) {
>>          spice_server_migrate_start(spice_server);
>> -    } else if (e->type == MIG_EVENT_PRECOPY_DONE) {
>> +    } else if (e->type == MIG_EVENT_PRECOPY_DONE ||
>> +               e->type == MIG_EVENT_POSTCOPY_START) {
>>          spice_server_migrate_end(spice_server, true);
>>          spice_have_target_host = false;
>>      } else if (e->type == MIG_EVENT_PRECOPY_FAILED) {

Reply via email to