linux/drivers/iommu
Vasant Hegde 2cc73c5712 iommu: Attach device group to old domain in error path
iommu_attach_group() attaches all devices in a group to domain and then
sets group domain (group->domain). Current code (__iommu_attach_group())
does not handle error path. This creates problem as devices to domain
attachment is in inconsistent state.

Flow:
  - During boot iommu attach devices to default domain
  - Later some device driver (like amd/iommu_v2 or vfio) tries to attach
    device to new domain.
  - In iommu_attach_group() path we detach device from current domain.
    Then it tries to attach devices to new domain.
  - If it fails to attach device to new domain then device to domain link
    is broken.
  - iommu_attach_group() returns error.
  - At this stage iommu_attach_group() caller thinks, attaching device to
    new domain failed and devices are still attached to old domain.
  - But in reality device to old domain link is broken. It will result
    in all sort of failures (like IO page fault) later.

To recover from this situation, we need to attach all devices back to the
old domain. Also log warning if it fails attach device back to old domain.

Suggested-by: Lu Baolu <baolu.lu@linux.intel.com>
Reported-by: Matt Fagnani <matt.fagnani@bell.net>
Signed-off-by: Vasant Hegde <vasant.hegde@amd.com>
Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
Tested-by: Matt Fagnani <matt.fagnani@bell.net>
Link: https://lore.kernel.org/r/20230215052642.6016-1-vasant.hegde@amd.com
Link: https://bugzilla.kernel.org/show_bug.cgi?id=216865
Link: https://lore.kernel.org/lkml/15d0f9ff-2a56-b3e9-5b45-e6b23300ae3b@leemhuis.info/
Signed-off-by: Joerg Roedel <jroedel@suse.de>
2023-02-18 15:34:24 +01:00
..
amd iommu: Remove detach_dev callbacks 2023-01-13 16:39:14 +01:00
arm iommu: Remove detach_dev callbacks 2023-01-13 16:39:14 +01:00
intel iommu/intel: Use GFP_KERNEL in sleepable contexts 2023-01-25 11:52:06 +01:00
iommufd iommufd: Use GFP_KERNEL_ACCOUNT for iommu_map() 2023-01-25 11:52:04 +01:00
apple-dart.c iommu: Remove detach_dev callbacks 2023-01-13 16:39:14 +01:00
dma-iommu.c Merge branch 'iommu-memory-accounting' into core 2023-01-25 11:54:58 +01:00
dma-iommu.h iommu/dma: Make header private 2022-09-09 09:26:22 +02:00
exynos-iommu.c iommu/exynos: Add missing set_platform_dma_ops callback 2023-02-03 10:41:24 +01:00
fsl_pamu_domain.c iommu/fsl_pamu: Fix compile error after adding set_platform_dma_ops 2023-01-13 22:30:55 +01:00
fsl_pamu_domain.h iommu/fsl_pamu: remove the snoop_id field 2021-04-07 10:56:52 +02:00
fsl_pamu.c Merge branches 'arm/allwinner', 'arm/exynos', 'arm/mediatek', 'arm/rockchip', 'arm/smmu', 'ppc/pamu', 's390', 'x86/vt-d', 'x86/amd' and 'core' into next 2022-12-12 12:50:53 +01:00
fsl_pamu.h iommu/fsl_pamu: hardcode the window address and size in pamu_config_ppaace 2021-04-07 10:56:52 +02:00
hyperv-iommu.c iommu/hyper-v: Allow hyperv irq remapping without x2apic 2022-11-28 16:48:20 +00:00
io-pgfault.c iommu: Rename iommu-sva-lib.{c,h} 2022-11-03 15:47:54 +01:00
io-pgtable-arm-v7s.c iommu/io-pgtable-arm-v7s: Remove map/unmap 2022-11-19 10:44:15 +01:00
io-pgtable-arm.c iommu/io-pgtable-arm: Remove map/unmap 2022-11-19 10:44:15 +01:00
io-pgtable-arm.h
io-pgtable-dart.c iommu/io-pgtable-dart: Add DART PTE support for t6000 2022-09-26 13:49:40 +02:00
io-pgtable.c Merge branches 'apple/dart', 'arm/mediatek', 'arm/omap', 'arm/smmu', 'virtio', 'x86/vt-d', 'x86/amd' and 'core' into next 2022-09-26 15:52:31 +02:00
ioasid.c iommu/sva: Assign a PASID to mm on PASID allocation and free it on mm exit 2022-02-15 11:31:35 +01:00
iommu-debugfs.c
iommu-sva.c iommu: Rename iommu-sva-lib.{c,h} 2022-11-03 15:47:54 +01:00
iommu-sva.h iommu: Rename iommu-sva-lib.{c,h} 2022-11-03 15:47:54 +01:00
iommu-sysfs.c
iommu-traces.c iommu: Remove detach_dev callback 2023-01-13 16:39:18 +01:00
iommu.c iommu: Attach device group to old domain in error path 2023-02-18 15:34:24 +01:00
iova.c iova: Remove iovad->rcaches check in iova_rcache_get() 2022-09-09 09:27:03 +02:00
ipmmu-vmsa.c iommu/ipmmu-vmsa: Remove ipmmu_utlb_disable() 2023-01-13 20:19:11 +01:00
irq_remapping.c
irq_remapping.h
Kconfig iommu: Tidy up io-pgtable dependencies 2023-01-13 16:59:48 +01:00
Makefile iommufd: File descriptor, context, kconfig and makefiles 2022-11-30 20:16:49 -04:00
msm_iommu_hw-8xxx.h
msm_iommu.c iommu: Add set_platform_dma_ops callbacks 2023-01-13 16:39:16 +01:00
msm_iommu.h
mtk_iommu_v1.c iommu: Add set_platform_dma_ops callbacks 2023-01-13 16:39:16 +01:00
mtk_iommu.c iommu: Remove detach_dev callbacks 2023-01-13 16:39:14 +01:00
of_iommu.c iommu/of: mark an unused function as __maybe_unused 2023-02-16 10:17:31 +01:00
omap-iommu-debug.c iommu/omap: Fix buffer overflow in debugfs 2022-09-07 10:42:28 +02:00
omap-iommu.c iommu: Add set_platform_dma_ops callbacks 2023-01-13 16:39:16 +01:00
omap-iommu.h
omap-iopgtable.h
rockchip-iommu.c iommu: Remove detach_dev callbacks 2023-01-13 16:39:14 +01:00
s390-iommu.c Merge branch 'iommu-memory-accounting' into core 2023-01-25 11:54:58 +01:00
sprd-iommu.c iommu: Remove detach_dev callbacks 2023-01-13 16:39:14 +01:00
sun50i-iommu.c iommu: Remove detach_dev callbacks 2023-01-13 16:39:14 +01:00
tegra-gart.c iommu: Add set_platform_dma_ops callbacks 2023-01-13 16:39:16 +01:00
tegra-smmu.c iommu: Add set_platform_dma_ops callbacks 2023-01-13 16:39:16 +01:00
virtio-iommu.c iommu: Propagate return value in ->attach_dev callback functions 2022-11-01 14:39:59 -03:00