From: Sean Christopherson <seanjc@google.com>
To: Maxim Levitsky <mlevitsk@redhat.com>
Cc: Paolo Bonzini <pbonzini@redhat.com>,
Vitaly Kuznetsov <vkuznets@redhat.com>,
Wanpeng Li <wanpengli@tencent.com>,
Jim Mattson <jmattson@google.com>, Joerg Roedel <joro@8bytes.org>,
kvm@vger.kernel.org, linux-kernel@vger.kernel.org,
Oliver Upton <oupton@google.com>, Peter Shier <pshier@google.com>
Subject: Re: [PATCH v2 17/21] KVM: x86: Morph pending exceptions to pending VM-Exits at queue time
Date: Mon, 11 Jul 2022 15:22:52 +0000 [thread overview]
Message-ID: <YsxATIxJjYrrg7nc@google.com> (raw)
In-Reply-To: <6fad40967afa4a7ed74c0f4158c8e841b1384318.camel@redhat.com>
On Sun, Jul 10, 2022, Maxim Levitsky wrote:
> On Thu, 2022-07-07 at 01:24 +0000, Sean Christopherson wrote:
> > On Wed, Jul 06, 2022, Maxim Levitsky wrote:
> > > Other than that, this is a _very_ good idea to add it to KVM, although
> > > maybe we should put it in Documentation folder instead?
> > > (but I don't have a strong preference on this)
> >
> > I definitely want a comment in KVM that's relatively close to the code. I'm not
> > opposed to also adding something in Documentation, but I'd want that to be an "and"
> > not an "or".
>
> Also makes sense.
>
> I do think that it is worthwhile to also add a comment about the way KVM
> handles exceptions, which means that inject_pending_event is not always called on instruction
> boundary. When we have a pending/injected exception we have first to get rid of it,
> and only then we will be on instruction boundary.
Yeah, though it's not like KVM has much of a choice, e.g. intercepted=>reflected
exceptions must be injected during instruction execution. I wouldn't be opposed
to renaming inject_pending_event() if someone can come up with a decent alternative
that's sufficiently descriptive but not comically verbose.
kvm_check_events() to pair with kvm_check_nested_events()? kvm_check_and_inject_events()?
> And to be sure that we will inject pending interrupts on the closest instruction
> boundary, we actually open an interrupt/smi/nmi window there.
> > This is calling out something slightly different. What it's saying is that if
> > there was a pending exception, then KVM should _not_ have injected said pending
> > exception and instead should have requested an immediate exit. That "immediate
> > exit" should have forced a VM-Exit before the CPU could fetch a new instruction,
> > and thus before the guest could trigger an exception that would require reinjection.
> >
> > The "immediate exit" trick works because all events with higher priority than the
> > VMX preeemption timer (or IRQ) are guaranteed to exit, e.g. a hardware SMI can't
> > cause a fault in the guest.
>
> Yes it all makes sense now. It really helps thinking in terms of instruction boundary.
>
> However, that makes me think: Can that actually happen?
I don't think KVM can get itself in that state, but I believe userspace could force
it by using KVM_SET_VCPU_EVENTS + KVM_SET_NESTED_STATE.
> A pending exception can only be generated by KVM itself (nested hypervisor,
> and CPU reflected exceptions/interrupts are all injected).
>
> If VMRUN/VMRESUME has a pending exception, it means that it itself generated it,
> in which case we won't be entering the guest, but rather jump to the
> exception handler, and thus nested run will not be pending.
Notably, SVM handles single-step #DBs on VMRUN in the nested VM-Exit path. That's
the only exception that I can think of off the top of my head that can be coincident
with a successful VM-Entry (ignoring things like NMI=>#PF).
> We can though have pending NMI/SMI/interrupts.
>
> Also just a note about injected exceptions/interrupts during VMRUN/VMRESUME.
>
> If nested_run_pending is true, then the injected exception due to the same
> reasoning can not come from VMRUN/VMRESUME. It can come from nested hypevisor's EVENTINJ,
> but in this case we currently just copy it from vmcb12/vmcs12 to vmcb02/vmcs02,
> without touching vcpu->arch.interrupt.
>
> Luckily this doesn't cause issues because when the nested run is pending
> we don't inject anything to the guest.
>
> If nested_run_pending is false however, the opposite is true. The EVENTINJ
> will be already delivered, and we can only have injected exception/interrupt
> that come from the cpu itself via exit_int_info/IDT_VECTORING_INFO_FIELD which
> we will copy back as injected interrupt/exception to 'vcpu->arch.exception/interrupt'.
> and later re-inject, next time we run the same VMRUN instruction.
next prev parent reply other threads:[~2022-07-11 15:23 UTC|newest]
Thread overview: 78+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-06-14 20:47 [PATCH v2 00/21] KVM: x86: Event/exception fixes and cleanups Sean Christopherson
2022-06-14 20:47 ` [PATCH v2 01/21] KVM: nVMX: Unconditionally purge queued/injected events on nested "exit" Sean Christopherson
2022-06-16 23:47 ` Jim Mattson
2022-07-06 11:40 ` Maxim Levitsky
2022-06-14 20:47 ` [PATCH v2 02/21] KVM: VMX: Drop bits 31:16 when shoving exception error code into VMCS Sean Christopherson
2022-07-06 11:43 ` Maxim Levitsky
2022-07-06 16:12 ` Sean Christopherson
2022-07-06 18:50 ` Maxim Levitsky
2022-07-06 20:02 ` Jim Mattson
2022-06-14 20:47 ` [PATCH v2 03/21] KVM: x86: Don't check for code breakpoints when emulating on exception Sean Christopherson
2022-07-06 11:43 ` Maxim Levitsky
2022-07-06 22:17 ` Jim Mattson
2022-06-14 20:47 ` [PATCH v2 04/21] KVM: nVMX: Treat General Detect #DB (DR7.GD=1) as fault-like Sean Christopherson
2022-07-06 11:45 ` Maxim Levitsky
2022-06-14 20:47 ` [PATCH v2 05/21] KVM: nVMX: Prioritize TSS T-flag #DBs over Monitor Trap Flag Sean Christopherson
2022-07-06 11:57 ` Maxim Levitsky
2022-07-06 23:51 ` Jim Mattson
2022-07-07 17:14 ` Sean Christopherson
2022-06-14 20:47 ` [PATCH v2 06/21] KVM: x86: Treat #DBs from the emulator as fault-like (code and DR7.GD=1) Sean Christopherson
2022-07-06 11:57 ` Maxim Levitsky
2022-07-06 23:55 ` Jim Mattson
2022-07-07 17:19 ` Sean Christopherson
2022-06-14 20:47 ` [PATCH v2 07/21] KVM: x86: Use DR7_GD macro instead of open coding check in emulator Sean Christopherson
2022-07-06 11:58 ` Maxim Levitsky
2022-06-14 20:47 ` [PATCH v2 08/21] KVM: nVMX: Ignore SIPI that arrives in L2 when vCPU is not in WFS Sean Christopherson
2022-07-06 11:59 ` Maxim Levitsky
2022-06-14 20:47 ` [PATCH v2 09/21] KVM: nVMX: Unconditionally clear mtf_pending on nested VM-Exit Sean Christopherson
2022-07-06 12:00 ` Maxim Levitsky
2022-07-06 16:45 ` Sean Christopherson
2022-07-06 20:03 ` Maxim Levitsky
2022-06-14 20:47 ` [PATCH v2 10/21] KVM: VMX: Inject #PF on ENCLS as "emulated" #PF Sean Christopherson
2022-07-06 12:00 ` Maxim Levitsky
2022-06-14 20:47 ` [PATCH v2 11/21] KVM: x86: Rename kvm_x86_ops.queue_exception to inject_exception Sean Christopherson
2022-07-06 12:01 ` Maxim Levitsky
2022-06-14 20:47 ` [PATCH v2 12/21] KVM: x86: Make kvm_queued_exception a properly named, visible struct Sean Christopherson
2022-07-06 12:02 ` Maxim Levitsky
2022-07-18 13:07 ` Maxim Levitsky
2022-07-18 13:10 ` Maxim Levitsky
2022-07-18 15:40 ` Sean Christopherson
2022-06-14 20:47 ` [PATCH v2 13/21] KVM: x86: Formalize blocking of nested pending exceptions Sean Christopherson
2022-07-06 12:04 ` Maxim Levitsky
2022-07-06 17:36 ` Sean Christopherson
2022-07-06 20:03 ` Maxim Levitsky
2022-06-14 20:47 ` [PATCH v2 14/21] KVM: x86: Use kvm_queue_exception_e() to queue #DF Sean Christopherson
2022-07-06 12:04 ` Maxim Levitsky
2022-06-14 20:47 ` [PATCH v2 15/21] KVM: x86: Hoist nested event checks above event injection logic Sean Christopherson
2022-07-06 12:05 ` Maxim Levitsky
2022-06-14 20:47 ` [PATCH v2 16/21] KVM: x86: Evaluate ability to inject SMI/NMI/IRQ after potential VM-Exit Sean Christopherson
2022-07-06 12:05 ` Maxim Levitsky
2022-06-14 20:47 ` [PATCH v2 17/21] KVM: x86: Morph pending exceptions to pending VM-Exits at queue time Sean Christopherson
2022-07-06 12:15 ` Maxim Levitsky
2022-07-07 1:24 ` Sean Christopherson
2022-07-10 15:56 ` Maxim Levitsky
2022-07-11 15:22 ` Sean Christopherson [this message]
2022-06-14 20:47 ` [PATCH v2 18/21] KVM: x86: Treat pending TRIPLE_FAULT requests as pending exceptions Sean Christopherson
2022-07-06 12:16 ` Maxim Levitsky
2022-06-14 20:47 ` [PATCH v2 19/21] KVM: VMX: Update MTF and ICEBP comments to document KVM's subtle behavior Sean Christopherson
2022-06-14 20:47 ` [PATCH v2 20/21] KVM: selftests: Use uapi header to get VMX and SVM exit reasons/codes Sean Christopherson
2022-07-06 12:16 ` Maxim Levitsky
2022-06-14 20:47 ` [PATCH v2 21/21] KVM: selftests: Add an x86-only test to verify nested exception queueing Sean Christopherson
2022-07-06 12:17 ` Maxim Levitsky
2022-06-16 13:16 ` [PATCH v2 00/21] KVM: x86: Event/exception fixes and cleanups Maxim Levitsky
2022-06-29 11:16 ` Maxim Levitsky
2022-06-29 13:42 ` Jim Mattson
2022-06-30 8:22 ` Maxim Levitsky
2022-06-30 12:17 ` Jim Mattson
2022-06-30 13:10 ` Maxim Levitsky
2022-06-30 16:28 ` Jim Mattson
2022-07-01 7:37 ` Maxim Levitsky
2022-07-06 11:54 ` Maxim Levitsky
2022-07-06 17:13 ` Jim Mattson
2022-07-06 17:52 ` Sean Christopherson
2022-07-06 20:03 ` Maxim Levitsky
2022-07-06 20:11 ` Jim Mattson
2022-07-10 15:58 ` Maxim Levitsky
2022-06-29 15:53 ` Jim Mattson
2022-06-30 8:24 ` Maxim Levitsky
2022-06-30 12:20 ` Jim Mattson
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=YsxATIxJjYrrg7nc@google.com \
--to=seanjc@google.com \
--cc=jmattson@google.com \
--cc=joro@8bytes.org \
--cc=kvm@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mlevitsk@redhat.com \
--cc=oupton@google.com \
--cc=pbonzini@redhat.com \
--cc=pshier@google.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.