From: Jan Kiszka <jan.kiszka@siemens.com>
To: Gleb Natapov <gleb@redhat.com>
Cc: Marcelo Tosatti <mtosatti@redhat.com>, kvm <kvm@vger.kernel.org>,
Paolo Bonzini <pbonzini@redhat.com>,
"Nadav Har'El" <nyh@math.technion.ac.il>
Subject: Re: [PATCH v3 4/5] KVM: nVMX: Fix conditions for interrupt injection
Date: Fri, 12 Apr 2013 11:00:33 +0200 [thread overview]
Message-ID: <5167CD31.7070902@siemens.com> (raw)
In-Reply-To: <20130411142955.GB17919@redhat.com>
On 2013-04-11 16:29, Gleb Natapov wrote:
> On Thu, Apr 11, 2013 at 04:27:23PM +0200, Jan Kiszka wrote:
>> On 2013-04-11 13:20, Gleb Natapov wrote:
>>> On Sun, Mar 24, 2013 at 07:44:47PM +0100, Jan Kiszka wrote:
>>>> From: Jan Kiszka <jan.kiszka@siemens.com>
>>>>
>>>> If we are in guest mode, L0 can only inject events into L2 if L1 has
>>>> nothing pending. Otherwise, L0 would overwrite L1's events and they
>>>> would get lost. But even if no injection of L1 is pending, we do not
>>>> want L0 to interrupt unnecessarily an on going vmentry with all its side
>>>> effects on the vmcs. Therefore, injection shall be disallowed during
>>>> L1->L2 transitions. This check is conceptually independent of
>>>> nested_exit_on_intr.
>>>>
>>>> If L1 traps external interrupts, then we also need to look at L1's
>>>> idt_vectoring_info_field. If it is empty, we can kick the guest from L2
>>>> to L1, just like the previous code worked.
>>>>
>>>> Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
>>>> ---
>>>> arch/x86/kvm/vmx.c | 28 ++++++++++++++++++++--------
>>>> 1 files changed, 20 insertions(+), 8 deletions(-)
>>>>
>>>> diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c
>>>> index d1bc834..30aa198 100644
>>>> --- a/arch/x86/kvm/vmx.c
>>>> +++ b/arch/x86/kvm/vmx.c
>>>> @@ -4325,16 +4325,28 @@ static int vmx_nmi_allowed(struct kvm_vcpu *vcpu)
>>>>
>>>> static int vmx_interrupt_allowed(struct kvm_vcpu *vcpu)
>>>> {
>>>> - if (is_guest_mode(vcpu) && nested_exit_on_intr(vcpu)) {
>>>> + if (is_guest_mode(vcpu)) {
>>>> struct vmcs12 *vmcs12 = get_vmcs12(vcpu);
>>>> - if (to_vmx(vcpu)->nested.nested_run_pending ||
>>>> - (vmcs12->idt_vectoring_info_field &
>>>> - VECTORING_INFO_VALID_MASK))
>>>> +
>>>> + if (to_vmx(vcpu)->nested.nested_run_pending)
>>>> return 0;
>>>> - nested_vmx_vmexit(vcpu);
>>>> - vmcs12->vm_exit_reason = EXIT_REASON_EXTERNAL_INTERRUPT;
>>>> - vmcs12->vm_exit_intr_info = 0;
>>>> - /* fall through to normal code, but now in L1, not L2 */
>>>> + if (nested_exit_on_intr(vcpu)) {
>>>> + /*
>>>> + * Check if the idt_vectoring_info_field is free. We
>>>> + * cannot raise EXIT_REASON_EXTERNAL_INTERRUPT if it
>>>> + * isn't.
>>>> + */
>>>> + if (vmcs12->idt_vectoring_info_field &
>>>> + VECTORING_INFO_VALID_MASK)
>>>> + return 0;
>>> After patch 2 I do not see how this can be true. Now this case is
>>> handled by the common code: since event queue is not empty the code will not
>>> get here.
>>
>> The event queue is unconditionally cleared (after being migrated to
>> vmcs12) in patch 2.
>>
> During vmexit, yes. But here we are in if(is_guest_mode(vcpu)).
Hmm, looks like: We leave L2, transfer the real vectoring info into the
queue and then consider injecting something in addition. That should
actually be avoided at higher level. Ok, will drop this test.
Jan
--
Siemens AG, Corporate Technology, CT RTC ITP SDP-DE
Corporate Competence Center Embedded Linux
next prev parent reply other threads:[~2013-04-12 9:00 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-03-24 18:44 [PATCH v3 0/5] KVM: nVMX: Make direct IRQ/NMI injection work Jan Kiszka
2013-03-24 18:44 ` [PATCH v3 1/5] KVM: nVMX: Fix injection of PENDING_INTERRUPT and NMI_WINDOW exits to L1 Jan Kiszka
2013-03-24 18:44 ` [PATCH v3 2/5] KVM: nVMX: Rework event injection and recovery Jan Kiszka
2013-04-10 13:42 ` Gleb Natapov
2013-04-10 13:49 ` Jan Kiszka
2013-04-11 11:22 ` Gleb Natapov
2013-03-24 18:44 ` [PATCH v3 3/5] KVM: VMX: Move vmx_nmi_allowed after vmx_set_nmi_mask Jan Kiszka
2013-03-24 18:44 ` [PATCH v3 4/5] KVM: nVMX: Fix conditions for interrupt injection Jan Kiszka
2013-04-11 11:20 ` Gleb Natapov
2013-04-11 14:27 ` Jan Kiszka
2013-04-11 14:29 ` Gleb Natapov
2013-04-12 9:00 ` Jan Kiszka [this message]
2013-03-24 18:44 ` [PATCH v3 5/5] KVM: nVMX: Fix conditions for NMI injection Jan Kiszka
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=5167CD31.7070902@siemens.com \
--to=jan.kiszka@siemens.com \
--cc=gleb@redhat.com \
--cc=kvm@vger.kernel.org \
--cc=mtosatti@redhat.com \
--cc=nyh@math.technion.ac.il \
--cc=pbonzini@redhat.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox