• Daniel Drake's avatar
    iommu/vt-d: Ignore devices with out-of-spec domain number · da72a379
    Daniel Drake authored
    VMD subdevices are created with a PCI domain ID of 0x10000 or
    higher.
    
    These subdevices are also handled like all other PCI devices by
    dmar_pci_bus_notifier().
    
    However, when dmar_alloc_pci_notify_info() take records of such devices,
    it will truncate the domain ID to a u16 value (in info->seg).
    The device at (e.g.) 10000:00:02.0 is then treated by the DMAR code as if
    it is 0000:00:02.0.
    
    In the unlucky event that a real device also exists at 0000:00:02.0 and
    also has a device-specific entry in the DMAR table,
    dmar_insert_dev_scope() will crash on:
       BUG_ON(i >= devices_cnt);
    
    That's basically a sanity check that only one PCI device matches a
    single DMAR entry; in this case we seem to have two matching devices.
    
    Fix this by ignoring devices that have a domain number higher than
    what can be looked up in the DMAR table.
    
    This problem was carefully diagnosed by Jian-Hong Pan.
    Signed-off-by: default avatarLu Baolu <baolu.lu@linux.intel.com>
    Signed-off-by: default avatarDaniel Drake <drake@endlessm.com>
    Fixes: 59ce0515 ("iommu/vt-d: Update DRHD/RMRR/ATSR device scope caches when PCI hotplug happens")
    Signed-off-by: default avatarJoerg Roedel <jroedel@suse.de>
    da72a379
dmar.c 55.9 KB