• Nadav Amit's avatar
    iommu/vt-d: Fix wrong analysis whether devices share the same bus · 2c700108
    Nadav Amit authored
    set_msi_sid_cb() is used to determine whether device aliases share the
    same bus, but it can provide false indications that aliases use the same
    bus when in fact they do not. The reason is that set_msi_sid_cb()
    assumes that pdev is fixed, while actually pci_for_each_dma_alias() can
    call fn() when pdev is set to a subordinate device.
    
    As a result, running an VM on ESX with VT-d emulation enabled can
    results in the log warning such as:
    
      DMAR: [INTR-REMAP] Request device [00:11.0] fault index 3b [fault reason 38] Blocked an interrupt request due to source-id verification failure
    
    This seems to cause additional ata errors such as:
      ata3.00: qc timeout (cmd 0xa1)
      ata3.00: failed to IDENTIFY (I/O error, err_mask=0x4)
    
    These timeouts also cause boot to be much longer and other errors.
    
    Fix it by checking comparing the alias with the previous one instead.
    
    Fixes: 3f0c625c ("iommu/vt-d: Allow interrupts from the entire bus for aliased devices")
    Cc: stable@vger.kernel.org
    Cc: Logan Gunthorpe <logang@deltatee.com>
    Cc: David Woodhouse <dwmw2@infradead.org>
    Cc: Joerg Roedel <joro@8bytes.org>
    Cc: Jacob Pan <jacob.jun.pan@linux.intel.com>
    Signed-off-by: default avatarNadav Amit <namit@vmware.com>
    Reviewed-by: default avatarLogan Gunthorpe <logang@deltatee.com>
    Signed-off-by: default avatarJoerg Roedel <jroedel@suse.de>
    2c700108
intel_irq_remapping.c 37 KB