>>> On 25.06.15 at 14:02, <li...@eikelenboom.it> wrote: > Thursday, June 25, 2015, 1:29:39 PM, you wrote: >>>>> On 25.06.15 at 12:51, <li...@eikelenboom.it> wrote: >>> Attached is the xl-dmesg output of: >>> >>> - debug-keys M and i before guest boot >>> - guest boot >>> - debug-keys M and i after lsusb in the guest that hangs. > >> Interesting: > >> (XEN) [2015-06-25 10:46:31.820] MSI-X 84 vec=aa lowest edge assert >> log > lowest dest=00000002 mask=1/ G/1 >> (XEN) [2015-06-25 10:46:31.820] MSI-X 85 vec=b2 lowest edge assert >> log > lowest dest=00000002 mask=1/ G/1 >> (XEN) [2015-06-25 10:46:31.820] MSI-X 86 vec=ba lowest edge assert >> log > lowest dest=00000002 mask=1/ G/1 >> (XEN) [2015-06-25 10:46:31.820] MSI-X 87 vec=c2 lowest edge assert >> log > lowest dest=00000002 mask=1/ G/1 >> (XEN) [2015-06-25 10:46:31.820] MSI-X 88 vec=ca lowest edge assert >> log > lowest dest=00000002 mask=1/ G/1 > >> I.e. they didn't get unmasked by the guest.
Attached a first debugging patch. Jan
--- unstable.orig/xen/arch/x86/hvm/vmsi.c 2015-06-22 11:50:41.000000000 +0200 +++ unstable/xen/arch/x86/hvm/vmsi.c 2015-06-26 11:50:44.000000000 +0200 @@ -267,18 +267,30 @@ static int msixtbl_write(struct vcpu *v, int r = X86EMUL_UNHANDLEABLE; unsigned long flags; struct irq_desc *desc; +unsigned int seg, bus, slot, func;//temp if ( (len != 4 && len != 8) || (address & (len - 1)) ) +{//temp + printk("MSI-X bad write (%lx,%lu)\n", address, len);//temp return r; +} rcu_read_lock(&msixtbl_rcu_lock); entry = msixtbl_find_entry(v, address); if ( !entry ) +{//temp + printk("MSI-X not found (%lx,%lu)\n", address, len);//temp goto out; +} nr_entry = (address - entry->gtable) / PCI_MSIX_ENTRY_SIZE; offset = address & (PCI_MSIX_ENTRY_SIZE - 1); +seg = entry->pdev->seg; +bus = entry->pdev->bus; +slot = PCI_SLOT(entry->pdev->devfn); +func = PCI_FUNC(entry->pdev->devfn); +printk("MSI-X write %04x:%02x:%02x.%u#%03x:%lx:%lu\n", seg, bus, slot, func, nr_entry, offset, len);//temp if ( offset != PCI_MSIX_ENTRY_VECTOR_CTRL_OFFSET ) { index = offset / sizeof(uint32_t); @@ -302,25 +314,37 @@ static int msixtbl_write(struct vcpu *v, if ( !(val & PCI_MSIX_VECTOR_BITMASK) && test_and_clear_bit(nr_entry, &entry->table_flags) ) { +printk("MSI-X defer %04x:%02x:%02x.%u#%03x:%lx:%lu\n", seg, bus, slot, func, nr_entry, offset, len);//temp v->arch.hvm_vcpu.hvm_io.msix_unmask_address = address; goto out; } msi_desc = msixtbl_addr_to_desc(entry, address); if ( !msi_desc || msi_desc->irq < 0 ) +{//temp + printk("MSI-X %04x:%02x:%02x.%u#%03x no IRQ (%d)\n", seg, bus, slot, func, nr_entry, msi_desc ? msi_desc->irq : INT_MIN);//temp goto out; +} +ASSERT(entry->pdev == msi_desc->dev);//temp desc = irq_to_desc(msi_desc->irq); if ( !desc ) +{//temp + printk("MSI-X %04x:%02x:%02x.%u#%03x no IRQ%d desc\n", seg, bus, slot, func, nr_entry, msi_desc->irq);//temp goto out; +} spin_lock_irqsave(&desc->lock, flags); if ( !desc->msi_desc ) +{//temp + printk("MSI-X %04x:%02x:%02x.%u#%03x no IRQ%d MSI desc\n", seg, bus, slot, func, nr_entry, msi_desc->irq);//temp goto unlock; +} ASSERT(msi_desc == desc->msi_desc); +printk("MSI-X %04x:%02x:%02x.%u#%03x IRQ%d mask=%d\n", seg, bus, slot, func, nr_entry, msi_desc->irq, !!(val & PCI_MSIX_VECTOR_BITMASK));//temp guest_mask_msi_irq(desc, !!(val & PCI_MSIX_VECTOR_BITMASK)); unlock:
_______________________________________________ Xen-devel mailing list Xen-devel@lists.xen.org http://lists.xen.org/xen-devel