David Gibson <da...@gibson.dropbear.id.au> wrote: > 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 <quint...@redhat.com> > Cc: Dave Gilbert <dgilb...@redhat.com> > Signed-off-by: David Gibson <da...@gibson.dropbear.id.au>
Reviewed-by: Juan Quintela <quint...@redhat.com> > > +static void do_kvm_cpu_synchronize_pre_loadvm(CPUState *cpu, run_on_cpu_data > arg) > +{ > + cpu->kvm_vcpu_dirty = true; > +} > + > +void kvm_cpu_synchronize_pre_loadvm(CPUState *cpu) > +{ > + run_on_cpu(cpu, do_kvm_cpu_synchronize_pre_loadvm, RUN_ON_CPU_NULL); > +} They are exactly the same, does it make sense to only have a copy? I don't really know, so I do the reviewed-by anyways.