Commit c7bdecae42 ("x86/apicv: fix RTC periodic timer and apicv issue") has added a assertion that intack.vector is the highest priority vector. But according to the osstest, the assertion failed sometimes. More discussion can be found in the thread (https://lists.xenproject.org/archives/html/xen-devel/2017-01/msg01019.html).
The assertion failure is hard to reproduce. In order to root cause issue, this patch is to add logs to dump PIR and vIRR when failure takes place. It should be reverted once the root cause is found. Signed-off-by: Chao Gao <chao....@intel.com> --- xen/arch/x86/hvm/vmx/intr.c | 43 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/xen/arch/x86/hvm/vmx/intr.c b/xen/arch/x86/hvm/vmx/intr.c index 24e4505..5e5b37a 100644 --- a/xen/arch/x86/hvm/vmx/intr.c +++ b/xen/arch/x86/hvm/vmx/intr.c @@ -23,6 +23,7 @@ #include <xen/errno.h> #include <xen/trace.h> #include <xen/event.h> +#include <asm/apicdef.h> #include <asm/current.h> #include <asm/cpufeature.h> #include <asm/processor.h> @@ -318,6 +319,48 @@ void vmx_intr_assist(void) */ if ( pt_vector != -1 ) { + /* + * We assert that intack.vector is the highest priority vector for + * only an interrupt from vlapic can reach this point and the + * highest vector is chosen in hvm_vcpu_has_pending_irq(). + * But, in fact, the assertion failed sometimes. It is suspected + * that PIR is not synced to vIRR which makes pt_vector is left in + * PIR. In order to verify this suspicion, dump some information + * when the assertion fails. + */ + if ( unlikely(intack.vector < pt_vector) ) + { + struct vlapic *vlapic; + struct pi_desc *pi_desc; + uint32_t *word; + int i; + + printk("Assertion failed on %pv. Some info are below.\n", + current); + printk("intack info: vector 0x%2x, source %x\n", intack.vector, + intack.source); + printk("pt_vector info: vector 0x%2x\n", pt_vector); + + vlapic = vcpu_vlapic(v); + if ( vlapic && vlapic->regs->data ) + { + word = (void *)&vlapic->regs->data[APIC_IRR]; + printk("vIRR:"); + for ( i = NR_VECTORS / 32 - 1; i >= 0 ; i-- ) + printk(" %08x", word[i*4]); + printk("\n"); + } + + pi_desc = &v->arch.hvm_vmx.pi_desc; + if ( pi_desc && pi_desc->pir ) + { + word = (void *)&pi_desc->pir; + printk(" PIR:"); + for ( i = NR_VECTORS / 32 - 1; i >= 0 ; i-- ) + printk(" %08x", word[i]); + printk("\n"); + } + } ASSERT(intack.vector >= pt_vector); vmx_set_eoi_exit_bitmap(v, intack.vector); } -- 1.8.3.1 _______________________________________________ Xen-devel mailing list Xen-devel@lists.xen.org https://lists.xen.org/xen-devel