From: Sean Christopherson <sean.j.christopherson@intel.com>
To: Vitaly Kuznetsov <vkuznets@redhat.com>
Cc: kvm@vger.kernel.org, Paolo Bonzini <pbonzini@redhat.com>,
Wanpeng Li <wanpengli@tencent.com>,
Jim Mattson <jmattson@google.com>, Joerg Roedel <joro@8bytes.org>,
Cathy Avery <cavery@redhat.com>,
Maxim Levitsky <mlevitsk@redhat.com>
Subject: Re: [PATCH] KVM: nVMX: Preserve registers modifications done before nested_svm_vmexit()
Date: Wed, 27 May 2020 01:48:35 -0700 [thread overview]
Message-ID: <20200527084835.GO31696@linux.intel.com> (raw)
In-Reply-To: <20200527082921.218601-1-vkuznets@redhat.com>
Shortlog says nVMX, code says nSVM :-)
On Wed, May 27, 2020 at 10:29:21AM +0200, Vitaly Kuznetsov wrote:
> L2 guest hang is observed after 'exit_required' was dropped and nSVM
> switched to check_nested_events() completely. The hang is a busy loop when
> e.g. KVM is emulating an instruction (e.g. L2 is accessing MMIO space and
> we drop to userspace). After nested_svm_vmexit() and when L1 is doing VMRUN
> nested guest's RIP is not advanced so KVM goes into emulating the same
> instruction which cased nested_svm_vmexit() and the loop continues.
s/cased/caused?
> nested_svm_vmexit() is not new, however, with check_nested_events() we're
> now calling it later than before. In case by that time KVM has modified
> register state we may pick stale values from VMCS when trying to save
s/VMCS/VMCB
> nested guest state to nested VMCB.
>
> VMX code handles this case correctly: sync_vmcs02_to_vmcs12() called from
> nested_vmx_vmexit() does 'vmcs12->guest_rip = kvm_rip_read(vcpu)' and this
> ensures KVM-made modifications are preserved. Do the same for nVMX.
s/nVMX/nSVM
>
> Generally, nested_vmx_vmexit()/nested_svm_vmexit() need to pick up all
> nested guest state modifications done by KVM after vmexit. It would be
> great to find a way to express this in a way which would not require to
> manually track these changes, e.g. nested_{vmcb,vmcs}_get_field().
>
> Co-debugged-with: Paolo Bonzini <pbonzini@redhat.com>
> Signed-off-by: Vitaly Kuznetsov <vkuznets@redhat.com>
> ---
> - To certain extent we're fixing currently-pending 'KVM: SVM: immediately
> inject INTR vmexit' commit but I'm not certain about that. We had so many
> problems with nested events before switching to check_nested_events() that
> what worked before could just be treated as a miracle. Miracles tend to
> appear and disappear all of a sudden.
> ---
> arch/x86/kvm/svm/nested.c | 6 +++---
> 1 file changed, 3 insertions(+), 3 deletions(-)
>
> diff --git a/arch/x86/kvm/svm/nested.c b/arch/x86/kvm/svm/nested.c
> index 0f02521550b9..6b1049148c1b 100644
> --- a/arch/x86/kvm/svm/nested.c
> +++ b/arch/x86/kvm/svm/nested.c
> @@ -537,9 +537,9 @@ int nested_svm_vmexit(struct vcpu_svm *svm)
> nested_vmcb->save.cr2 = vmcb->save.cr2;
> nested_vmcb->save.cr4 = svm->vcpu.arch.cr4;
> nested_vmcb->save.rflags = kvm_get_rflags(&svm->vcpu);
> - nested_vmcb->save.rip = vmcb->save.rip;
> - nested_vmcb->save.rsp = vmcb->save.rsp;
> - nested_vmcb->save.rax = vmcb->save.rax;
> + nested_vmcb->save.rip = kvm_rip_read(&svm->vcpu);
> + nested_vmcb->save.rsp = kvm_rsp_read(&svm->vcpu);
> + nested_vmcb->save.rax = kvm_rax_read(&svm->vcpu);
> nested_vmcb->save.dr7 = vmcb->save.dr7;
> nested_vmcb->save.dr6 = svm->vcpu.arch.dr6;
> nested_vmcb->save.cpl = vmcb->save.cpl;
> --
> 2.25.4
>
next prev parent reply other threads:[~2020-05-27 8:48 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-05-27 8:29 [PATCH] KVM: nVMX: Preserve registers modifications done before nested_svm_vmexit() Vitaly Kuznetsov
2020-05-27 8:48 ` Sean Christopherson [this message]
2020-05-27 8:58 ` Vitaly Kuznetsov
2020-05-27 14:55 ` Sean Christopherson
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20200527084835.GO31696@linux.intel.com \
--to=sean.j.christopherson@intel.com \
--cc=cavery@redhat.com \
--cc=jmattson@google.com \
--cc=joro@8bytes.org \
--cc=kvm@vger.kernel.org \
--cc=mlevitsk@redhat.com \
--cc=pbonzini@redhat.com \
--cc=vkuznets@redhat.com \
--cc=wanpengli@tencent.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.