Gleb Natapov wrote on 2012-12-06: > 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) >>>>>> } >>>>>> >>>>>> 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); >>>>>> >>>>>> /* 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); >>>>> >>>>> If RVI is non-zero, then interrupt window should not be enabled, >>>>> accordingly to 29.2.2: >>>>> >>>>> "If a virtual interrupt has been recognized (see Section 29.2.1), it will >>>>> be delivered at an instruction boundary when the following conditions all >>>>> hold: (1) RFLAGS.IF = 1; (2) there is no blocking by STI; (3) there is no >>>>> blocking by MOV SS or by POP SS; and (4) the "interrupt-window exiting" >>>>> VM-execution control is 0." >>>> Right. Must check RVI here. >>>> >>> Why? We request interrupt window here because there is ExtINT interrupt >>> pending. ExtINT interrupt has a precedence over APIC interrupts (our >>> current code is incorrect!), so we want vmexit as soon as interrupts 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. >>> >>> -- >>> Gleb. >> >> Right. BTW, delivery of ExtINT has no EOI, so there is no evaluation >> of pending virtual interrupts. Therefore, shouldnt interrupt window be >> enabled when injecting ExtINT so that evaluation of pending virtual >> interrupts is performed on next vm-entry? >> > 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 same > time. So during ExtINT injection "evaluation" will happen (due to vmentry) > 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? Right. Vmentry causes the evaluation of pending virtual interrupt even during ExtINT injection. If RVI[7:4] > VPPR[7:4], the logical process recognizes a pending virtual interrupt. Then it will be delivery when condition is met. Best regards, Yang -- To unsubscribe from this list: send the line "unsubscribe kvm" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html