[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [ PATCH 2/2] xen: enable Virtual-interrupt delivery
On 09/06/12 12:35, Jan Beulich wrote: >>>> On 06.09.12 at 12:00, "Li, Jiongxi" <jiongxi.li@xxxxxxxxx> wrote: >>>> +/* >>>> + * When "Virtual Interrupt Delivery" is enabled, this function is >>>> +used >>>> + * to handle EOI-induced VM exit >>>> + */ >>>> +void vlapic_handle_EOI_induced_exit(struct vlapic *vlapic, int >>>> +vector) { >>>> + ASSERT(cpu_has_vmx_virtual_intr_delivery); >>>> + >>>> + if ( vlapic_test_and_clear_vector(vector, >>>> + &vlapic->regs->data[APIC_TMR]) ) >>> >>> Why test_and_clear rather than just test? >> While virtual interrupt delivery is enabled, 'vlapic_EOI_set' function won't >> be called( 'vlapic_EOI_set' also has the test and clear call). ' > > Ah, okay. > >>>> --- a/xen/arch/x86/hvm/vmx/intr.c Fri Aug 31 09:30:38 2012 +0800 >>>> +++ b/xen/arch/x86/hvm/vmx/intr.c Fri Aug 31 09:49:39 2012 +0800 >>>> @@ -227,19 +227,43 @@ void vmx_intr_assist(void) >>>> goto out; >>>> >>>> intblk = hvm_interrupt_blocked(v, intack); >>>> - if ( intblk == hvm_intblk_tpr ) >>>> + if ( cpu_has_vmx_virtual_intr_delivery ) >>>> { >>>> - ASSERT(vlapic_enabled(vcpu_vlapic(v))); >>>> - ASSERT(intack.source == hvm_intsrc_lapic); >>>> - tpr_threshold = intack.vector >> 4; >>>> - goto out; >>>> + /* Set "Interrupt-window exiting" for ExtINT */ >>>> + if ( (intblk != hvm_intblk_none) && >>>> + ( (intack.source == hvm_intsrc_pic) || >>>> + ( intack.source == hvm_intsrc_vector) ) ) >>>> + { >>>> + enable_intr_window(v, intack); >>>> + goto out; >>>> + } >>>> + >>>> + if ( __vmread(VM_ENTRY_INTR_INFO) & >>> INTR_INFO_VALID_MASK ) >>>> + { >>>> + if ( (intack.source == hvm_intsrc_pic) || >>>> + (intack.source == hvm_intsrc_nmi) || >>>> + (intack.source == hvm_intsrc_mce) ) >>>> + enable_intr_window(v, intack); >>>> + >>>> + goto out; >>>> + } >>>> } >>>> + else >>>> + { >>>> + if ( intblk == hvm_intblk_tpr ) >>>> + { >>>> + ASSERT(vlapic_enabled(vcpu_vlapic(v))); >>>> + ASSERT(intack.source == hvm_intsrc_lapic); >>>> + tpr_threshold = intack.vector >> 4; >>>> + goto out; >>>> + } >>>> >>>> - if ( (intblk != hvm_intblk_none) || >>>> - (__vmread(VM_ENTRY_INTR_INFO) & >>> INTR_INFO_VALID_MASK) ) >>>> - { >>>> - enable_intr_window(v, intack); >>>> - goto out; >>>> + if ( (intblk != hvm_intblk_none) || >>>> + (__vmread(VM_ENTRY_INTR_INFO) & >>> INTR_INFO_VALID_MASK) ) >>>> + { >>>> + enable_intr_window(v, intack); >>>> + goto out; >>>> + } >>>> } >>> >>> If you made the above and if()/else if() series, some of the differences >> would go >>> away, making the changes easier to review. >> I can't quite understand you here. >> The original code looked like: >> if (a) >> {} >> if (b) >> {} >> And my change as follow: >> if ( cpu_has_vmx_virtual_intr_delivery ) >> { >> } >> else >> { >> if (a) >> {} >> if (b) >> {} >> } >> How should I adjust the code? > > Considering that the original could already have been written > with if/else-if, I was suggesting to expand this to your addition: > > if ( cpu_has_vmx_virtual_intr_delivery ) > { > } > else if (a) > {} > else if (b) > {} I think, move the VMX part into hvm/vmx/* and call a function pointer from common code. Having VMX or SVM specific code in common code is broken by design. Christoph -- ---to satisfy European Law for business letters: Advanced Micro Devices GmbH Einsteinring 24, 85689 Dornach b. Muenchen Geschaeftsfuehrer: Alberto Bozzo Sitz: Dornach, Gemeinde Aschheim, Landkreis Muenchen Registergericht Muenchen, HRB Nr. 43632 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |