>>> 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

Reply via email to