• D
    migration/ram.c: do not set 'postcopy_running' in POSTCOPY_INCOMING_END · acab30b8
    Daniel Henrique Barboza 提交于
    When migrating a VM with 'migrate_set_capability postcopy-ram on'
    a postcopy_state is set during the process, ending up with the
    state POSTCOPY_INCOMING_END when the migration is over. This
    postcopy_state is taken into account inside ram_load to check
    how it will load the memory pages. This same ram_load is called when
    in a loadvm command.
    
    Inside ram_load, the logic to see if we're at postcopy_running state
    is:
    
    postcopy_running = postcopy_state_get() >= POSTCOPY_INCOMING_LISTENING
    
    postcopy_state_get() returns this enum type:
    
    typedef enum {
        POSTCOPY_INCOMING_NONE = 0,
        POSTCOPY_INCOMING_ADVISE,
        POSTCOPY_INCOMING_DISCARD,
        POSTCOPY_INCOMING_LISTENING,
        POSTCOPY_INCOMING_RUNNING,
        POSTCOPY_INCOMING_END
    } PostcopyState;
    
    In the case where ram_load is executed and postcopy_state is
    POSTCOPY_INCOMING_END, postcopy_running will be set to 'true' and
    ram_load will behave like a postcopy is in progress. This scenario isn't
    achievable in a migration but it is reproducible when executing
    savevm/loadvm after migrating with 'postcopy-ram on', causing loadvm
    to fail with Error -22:
    
    Source:
    
    (qemu) migrate_set_capability postcopy-ram on
    (qemu) migrate tcp:127.0.0.1:4444
    
    Dest:
    
    (qemu) migrate_set_capability postcopy-ram on
    (qemu)
    ubuntu1704-intel login:
    Ubuntu 17.04 ubuntu1704-intel ttyS0
    
    ubuntu1704-intel login: (qemu)
    (qemu) savevm test1
    (qemu) loadvm test1
    Unknown combination of migration flags: 0x4 (postcopy mode)
    error while loading state for instance 0x0 of device 'ram'
    Error -22 while loading VM state
    (qemu)
    
    This patch fixes this problem by changing the existing logic for
    postcopy_advised and postcopy_running in ram_load, making them
    'false' if we're at POSTCOPY_INCOMING_END state.
    Signed-off-by: NDaniel Henrique Barboza <danielhb@linux.vnet.ibm.com>
    CC: Juan Quintela <quintela@redhat.com>
    CC: Dr. David Alan Gilbert <dgilbert@redhat.com>
    Reviewed-by: NPeter Xu <peterx@redhat.com>
    Reviewed-by: NJuan Quintela <quintela@redhat.com>
    Reported-by: NBalamuruhan S <bala24@linux.vnet.ibm.com>
    Signed-off-by: NJuan Quintela <quintela@redhat.com>
    acab30b8
ram.c 87.5 KB