kvm_put_vcpu_events() needs to be called before kvm_put_nested_state() because vCPU's hflag is referred in KVM vmx_get_nested_state() validation. Otherwise kvm_put_nested_state() can fail with -EINVAL when a vCPU is in VMX operation and enters SMM mode. This leads to live migration failure. Signed-off-by: Eiichi Tsukata <eiichi.tsukata@xxxxxxxxxxx> --- target/i386/kvm/kvm.c | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/target/i386/kvm/kvm.c b/target/i386/kvm/kvm.c index e7c054cc16..cd635c9142 100644 --- a/target/i386/kvm/kvm.c +++ b/target/i386/kvm/kvm.c @@ -4741,6 +4741,15 @@ int kvm_arch_put_registers(CPUState *cpu, int level) return ret; } + /* + * must be before kvm_put_nested_state so that HF_SMM_MASK is set during + * SMM. + */ + ret = kvm_put_vcpu_events(x86_cpu, level); + if (ret < 0) { + return ret; + } + if (level >= KVM_PUT_RESET_STATE) { ret = kvm_put_nested_state(x86_cpu); if (ret < 0) { @@ -4787,10 +4796,6 @@ int kvm_arch_put_registers(CPUState *cpu, int level) if (ret < 0) { return ret; } - ret = kvm_put_vcpu_events(x86_cpu, level); - if (ret < 0) { - return ret; - } if (level >= KVM_PUT_RESET_STATE) { ret = kvm_put_mp_state(x86_cpu); if (ret < 0) { -- 2.41.0