From mboxrd@z Thu Jan 1 00:00:00 1970 From: Gleb Natapov Subject: Re: [PATCH v3 3/4] x86, apicv: add virtual interrupt delivery support Date: Thu, 6 Dec 2012 11:28:15 +0200 Message-ID: <20121206092815.GE19514@redhat.com> References: <1354518064-3066-1-git-send-email-yang.z.zhang@intel.com> <1354518064-3066-4-git-send-email-yang.z.zhang@intel.com> <20121205020016.GA32458@amt.cnet> <20121205111438.GN19514@redhat.com> <20121205223859.GA28330@amt.cnet> Mime-Version: 1.0 Content-Type: text/plain; charset=cp1255 Content-Transfer-Encoding: QUOTED-PRINTABLE Cc: "Zhang, Yang Z" , "kvm@vger.kernel.org" , "Tian, Kevin" To: Marcelo Tosatti Return-path: Received: from mx1.redhat.com ([209.132.183.28]:35281 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754912Ab2LFJ2R convert rfc822-to-8bit (ORCPT ); Thu, 6 Dec 2012 04:28:17 -0500 Content-Disposition: inline In-Reply-To: <20121205223859.GA28330@amt.cnet> Sender: kvm-owner@vger.kernel.org List-ID: On Wed, Dec 05, 2012 at 08:38:59PM -0200, Marcelo Tosatti wrote: > On Wed, Dec 05, 2012 at 01:14:38PM +0200, Gleb Natapov wrote: > > On Wed, Dec 05, 2012 at 03:43:41AM +0000, Zhang, Yang Z wrote: > > > >> @@ -5657,12 +5673,20 @@ static int vcpu_enter_guest(struct kvm= _vcpu > > > > *vcpu) > > > >> } > > > >> =20 > > > >> if (kvm_check_request(KVM_REQ_EVENT, vcpu) || req_int_win) { > > > >> + /* update archtecture specific hints for APIC > > > >> + * virtual interrupt delivery */ > > > >> + if (kvm_x86_ops->update_irq) > > > >> + kvm_x86_ops->update_irq(vcpu); > > > >> + > > > >> inject_pending_event(vcpu); > > > >> =20 > > > >> /* enable NMI/IRQ window open exits if needed */ > > > >> if (vcpu->arch.nmi_pending) > > > >> kvm_x86_ops->enable_nmi_window(vcpu); > > > >> - else if (kvm_cpu_has_interrupt(vcpu) || req_int_win) > > > >> + else if (kvm_apic_vid_enabled(vcpu)) { > > > >> + if (kvm_cpu_has_extint(vcpu)) > > > >> + kvm_x86_ops->enable_irq_window(vcpu); > > > >=20 > > > > If RVI is non-zero, then interrupt window should not be enabled= , > > > > accordingly to 29.2.2: > > > >=20 > > > > "If a virtual interrupt has been recognized (see Section 29.2.1= ), it will > > > > be delivered at an instruction boundary when the following cond= itions all > > > > hold: (1) RFLAGS.IF =3D 1; (2) there is no blocking by STI; (3)= there is no > > > > blocking by MOV SS or by POP SS; and (4) the =93interrupt-windo= w exiting=94 > > > > VM-execution control is 0." > > > Right. Must check RVI here. > > >=20 > > Why? We request interrupt window here because there is ExtINT inter= rupt > > pending. ExtINT interrupt has a precedence over APIC interrupts (ou= r > > current code is incorrect!), so we want vmexit as soon as interrupt= s are > > allowed to inject ExtINT and we do not want virtual interrupt to be > > delivered. I think the (4) there is exactly for this situation. > >=20 > > -- > > Gleb. >=20 > Right. BTW, delivery of ExtINT has no EOI, so there is no evaluation > of pending virtual interrupts. Therefore, shouldnt interrupt window b= e > enabled when injecting ExtINT so that evaluation of pending virtual > interrupts is performed on next vm-entry? >=20 Good question and I think, luckily for us, the answer is no. Spec uses two different terms when it talks about virtual interrupts "Evaluation of Pending Virtual Interrupts" and "Virtual-Interrupt Delivery". As far as my reading of the spec goes they are not necessary happen at the sam= e time. So during ExtINT injection "evaluation" will happen (due to vment= ry) and virtual interrupt will be recognized, but not "delivered". It will be delivered when condition described in section 29.2.2 will be met i.e when interrupts will be enabled. Yang, can you confirm this? -- Gleb.