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 [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html