On 01/15/2014 03:57 PM, Alexey Kardashevskiy wrote: > Normally QEMU kvm_arch_get_registers() reads registers and sets a dirty > flag which prevents further registers reading from KVM till > kvm_arch_put_registers() executes and resets the flag. > > However if we run QEMU with "-S" ("suspended"), then execute "info cpus" > from the QEMU monitor, we end up with not reading registers in > rtas_start_cpu() as qmp_query_cpus() calls kvm_cpu_synchronize_state() > which leaves @kvm_vcpu_dirty=true what prevents kvm_cpu_synchronize_state() > from synchronizing registers and we loose the values. > > This resets @kvm_vcpu_dirty flag as we do not have content which we really > want to > keep at this point as the CPU is halted. > > Signed-off-by: Alexey Kardashevskiy <a...@ozlabs.ru> > ---
Alex, ping. Is it complicated or controversial patch? ;) > > We could also reset @kvm_vcpu_dirty in qmp_query_cpus() but that would be > racy. > --- > hw/ppc/spapr_rtas.c | 2 ++ > 1 file changed, 2 insertions(+) > > diff --git a/hw/ppc/spapr_rtas.c b/hw/ppc/spapr_rtas.c > index 1cb276d..3dade5e 100644 > --- a/hw/ppc/spapr_rtas.c > +++ b/hw/ppc/spapr_rtas.c > @@ -185,6 +185,8 @@ static void rtas_start_cpu(PowerPCCPU *cpu_, > sPAPREnvironment *spapr, > /* This will make sure qemu state is up to date with kvm, and > * mark it dirty so our changes get flushed back before the > * new cpu enters */ > + > + cs->kvm_vcpu_dirty = false; > kvm_cpu_synchronize_state(cs); > > env->msr = (1ULL << MSR_SF) | (1ULL << MSR_ME); > -- Alexey