• D
    migration: Mark CPU states dirty before incoming migration/loadvm · 75e972da
    David Gibson 提交于
    As a rule, CPU internal state should never be updated when
    !cpu->kvm_vcpu_dirty (or the HAX equivalent).  If that is done, then
    subsequent calls to cpu_synchronize_state() - usually safe and idempotent -
    will clobber state.
    
    However, we routinely do this during a loadvm or incoming migration.
    Usually this is called shortly after a reset, which will clear all the cpu
    dirty flags with cpu_synchronize_all_post_reset().  Nothing is expected
    to set the dirty flags again before the cpu state is loaded from the
    incoming stream.
    
    This means that it isn't safe to call cpu_synchronize_state() from a
    post_load handler, which is non-obvious and potentially inconvenient.
    
    We could cpu_synchronize_all_state() before the loadvm, but that would be
    overkill since a) we expect the state to already be synchronized from the
    reset and b) we expect to completely rewrite the state with a call to
    cpu_synchronize_all_post_init() at the end of qemu_loadvm_state().
    
    To clear this up, this patch introduces cpu_synchronize_pre_loadvm() and
    associated helpers, which simply marks the cpu state as dirty without
    actually changing anything.  i.e. it says we want to discard any existing
    KVM (or HAX) state and replace it with what we're going to load.
    
    Cc: Juan Quintela <quintela@redhat.com>
    Cc: Dave Gilbert <dgilbert@redhat.com>
    Signed-off-by: NDavid Gibson <david@gibson.dropbear.id.au>
    Reviewed-by: NJuan Quintela <quintela@redhat.com>
    75e972da
kvm-all.c 68.3 KB