• Alex Williamson's avatar
    iommu/vt-d: Detach domain *only* from attached iommus · 71684406
    Alex Williamson authored
    Device domains never span IOMMU hardware units, which allows the
    domain ID space for each IOMMU to be an independent address space.
    Therefore we can have multiple, independent domains, each with the
    same domain->id, but attached to different hardware units.  This is
    also why we need to do a heavy-weight search for VM domains since
    they can span multiple IOMMUs hardware units and we don't require a
    single global ID to use for all hardware units.
    
    Therefore, if we call iommu_detach_domain() across all active IOMMU
    hardware units for a non-VM domain, the result is that we clear domain
    IDs that are not associated with our domain, allowing them to be
    re-allocated and causing apparent coherency issues when the device
    cannot access IOVAs for the intended domain.
    
    This bug was introduced in commit fb170fb4 ("iommu/vt-d: Introduce
    helper functions to make code symmetric for readability"), but is
    significantly exacerbated by the more recent commit 62c22167
    ("iommu/vt-d: Fix dmar_domain leak in iommu_attach_device") which calls
    domain_exit() more frequently to resolve a domain leak.
    
    Fixes: fb170fb4 ("iommu/vt-d: Introduce helper functions to make code symmetric for readability")
    Signed-off-by: default avatarAlex Williamson <alex.williamson@redhat.com>
    Cc: Jiang Liu <jiang.liu@linux.intel.com>
    Cc: stable@vger.kernel.org # v3.17+
    Signed-off-by: default avatarJoerg Roedel <jroedel@suse.de>
    71684406
intel-iommu.c 119 KB