[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH] target/i386/kvm: call kvm_put_vcpu_events() before kvm_put_neste
|
From: |
Eiichi Tsukata |
|
Subject: |
[PATCH] target/i386/kvm: call kvm_put_vcpu_events() before kvm_put_nested_state() |
|
Date: |
Thu, 26 Oct 2023 05:42:01 +0000 |
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@nutanix.com>
---
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
- [PATCH] target/i386/kvm: call kvm_put_vcpu_events() before kvm_put_nested_state(),
Eiichi Tsukata <=