RE: [PATCH v3 3/4] x86, apicv: add virtual interrupt delivery support

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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


[Index of Archives]     [KVM ARM]     [KVM ia64]     [KVM ppc]     [Virtualization Tools]     [Spice Development]     [Libvirt]     [Libvirt Users]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite Questions]     [Linux Kernel]     [Linux SCSI]     [XFree86]
  Powered by Linux