linux/drivers/iommu
Alex Williamson d29425669a iommu/vt-d: Detach domain *only* from attached iommus
[ Upstream commit 7168440690 ]

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 fb170fb4c5 ("iommu/vt-d: Introduce
helper functions to make code symmetric for readability"), but is
significantly exacerbated by the more recent commit 62c22167dd
("iommu/vt-d: Fix dmar_domain leak in iommu_attach_device") which calls
domain_exit() more frequently to resolve a domain leak.

Fixes: fb170fb4c5 ("iommu/vt-d: Introduce helper functions to make code symmetric for readability")
Signed-off-by: Alex Williamson <alex.williamson@redhat.com>
Cc: Jiang Liu <jiang.liu@linux.intel.com>
Cc: stable@vger.kernel.org # v3.17+
Signed-off-by: Joerg Roedel <jroedel@suse.de>
Signed-off-by: Sasha Levin <sasha.levin@oracle.com>
History 2015-04-24 17:14:02 -04:00
..
amd_iommu.c Merge branches 'arm/exynos', 'arm/omap', 'arm/smmu', 'x86/vt-d', 'x86/amd' and 'core' into next 2014-10-02 12:24:45 +02:00
amd_iommu_init.c iommu/amd: Fix devid mapping for ivrs_ioapic override 2014-09-25 19:24:52 +02:00
amd_iommu_proto.h perf/x86/amd: Add IOMMU Performance Counter resource management 2013-06-19 13:04:52 +02:00
amd_iommu_types.h iommu/amd: Move struct iommu_dev_data to amd_iommu.c 2014-08-26 11:37:37 +02:00
amd_iommu_v2.c kvm: Fix page ageing bugs 2014-09-24 14:07:58 +02:00
arm-smmu.c Merge branches 'arm/exynos', 'arm/omap', 'arm/smmu', 'x86/vt-d', 'x86/amd' and 'core' into next 2014-10-02 12:24:45 +02:00
dmar.c Merge branches 'arm/exynos', 'arm/omap', 'arm/smmu', 'x86/vt-d', 'x86/amd' and 'core' into next 2014-10-02 12:24:45 +02:00
exynos-iommu.c iommu/exynos: Fix trivial typos 2014-08-19 13:07:43 +02:00
fsl_pamu.c Merge branches 'x86/vt-d', 'x86/amd', 'arm/omap', 'ppc/pamu', 'arm/smmu', 'arm/exynos' and 'core' into next 2014-07-31 20:29:02 +02:00
fsl_pamu.h iommu/fsl: Freescale PAMU driver and iommu implementation. 2013-08-14 11:38:34 +02:00
fsl_pamu_domain.c iommu/fsl: Convert to iommu_capable() API function 2014-09-25 15:47:37 +02:00
fsl_pamu_domain.h iommu/fsl: Freescale PAMU driver and iommu implementation. 2013-08-14 11:38:34 +02:00
intel-iommu.c iommu/vt-d: Detach domain *only* from attached iommus 2015-04-24 17:14:02 -04:00
intel_irq_remapping.c Merge branches 'arm/exynos', 'arm/omap', 'arm/smmu', 'x86/vt-d', 'x86/amd' and 'core' into next 2014-10-02 12:24:45 +02:00
iommu-sysfs.c iommu: Fix compile error in iommu-sysfs.c 2014-07-07 12:01:21 +02:00
iommu-traces.c iommu: Add iommu_error class event to iommu trace 2013-09-25 11:07:04 +02:00
iommu.c iommu: Fix bus notifier breakage 2014-09-25 16:46:37 +02:00
iova.c iommu/vt-d: Update IOMMU state when memory hotplug happens 2014-03-04 17:51:06 +01:00
ipmmu-vmsa.c iommu: Constify struct iommu_ops 2014-07-07 10:36:59 +02:00
irq_remapping.c iommu/irq_remapping: Fix the regression of hpet irq remapping 2014-09-25 19:11:47 +02:00
irq_remapping.h iommu/irq_remapping: Fix the regression of hpet irq remapping 2014-09-25 19:11:47 +02:00
Kconfig Merge branches 'x86/vt-d', 'x86/amd', 'arm/omap', 'ppc/pamu', 'arm/smmu', 'arm/exynos' and 'core' into next 2014-07-31 20:29:02 +02:00
Makefile Merge branches 'x86/vt-d', 'x86/amd', 'arm/omap', 'ppc/pamu', 'arm/smmu', 'arm/exynos' and 'core' into next 2014-07-31 20:29:02 +02:00
msm_iommu.c iommu/msm: Convert to iommu_capable() API function 2014-09-25 15:47:38 +02:00
msm_iommu.h iommu/msm: Move mach includes to iommu directory 2013-08-06 11:18:03 -07:00
msm_iommu_dev.c iommu/msm: Use devm_ioremap_resource to simplify code 2014-05-30 20:20:12 +02:00
msm_iommu_hw-8xxx.h iommu/msm: Move mach includes to iommu directory 2013-08-06 11:18:03 -07:00
of_iommu.c iommu: add missing include 2014-01-07 15:16:27 +01:00
omap-iommu-debug.c iommu/omap: Remove virtual memory manager 2014-07-29 12:38:07 +02:00
omap-iommu.c Merge branches 'arm/exynos', 'arm/omap', 'arm/smmu', 'x86/vt-d', 'x86/amd' and 'core' into next 2014-10-02 12:24:45 +02:00
omap-iommu.h iommu/omap: Remove omap_iommu unused owner field 2014-09-25 15:56:37 +02:00
omap-iommu2.c iommu/omap: Enable bus-error back on supported iommus 2014-03-04 17:02:08 +01:00
omap-iopgtable.h iommu/omap: Move to_iommu definition from omap-iopgtable.h 2014-04-16 16:30:15 +02:00
shmobile-iommu.c iommu: Constify struct iommu_ops 2014-07-07 10:36:59 +02:00
shmobile-ipmmu.c iommu/shmobile: Use devm_ioremap_resource() 2014-04-17 12:16:12 +02:00
shmobile-ipmmu.h iommu/shmobile: Turn the flush_lock mutex into a spinlock 2014-01-07 15:35:25 +01:00
tegra-gart.c iommu: Make of_device_id array const 2014-09-25 16:01:03 +02:00
tegra-smmu.c iommu: Make of_device_id array const 2014-09-25 16:01:03 +02:00