On 11/11/2015 12:17 PM, Paolo Bonzini wrote:
On 11/11/2015 10:09, Andrey Smetanin wrote:
I would prefer to put this in kvm_arch_init_vcpu, if possible.
Ok. I think the kvm_arch_init_vcpu() is called after migration restores
cpu->env->msr_hv_synic_* values, so unconditional initialization of
cpu->env->msr_hv_synic_* values can overwrite migrated values. The check
"if (!env->msr_hv_synic_version) {" is neccessary for first time
initialization to protect against such overwriting. This is why this
code migrates 'msr_hv_synic_version' value.
No, kvm_arch_init_vcpu is called at the very beginning, when the VCPU
thread is created.
main
-> machine_class->init
-> pc_init1
-> pc_cpus_init
-> pc_new_cpu
-> cpu_x86_create
-> object_property_set_bool
-> x86_cpu_realizefn
-> qemu_init_vcpu
-> qemu_kvm_start_vcpu
-> qemu_kvm_cpu_thread_fn (in new thread)
-> kvm_init_vcpu
-> kvm_arch_init_vcpu
This is long before qemu_start_incoming_migration, which is among the
last things done before calling main_loop
In this case I'll remove migration of msr_hv_synic_version and make
first time initialization inside kvm_arch_init_vcpu() - inside section
where SynIC availability cpuid bit is set.
Thank you for clarification.
Paolo
--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html