linux/drivers/iommu
Yian Chen 963c80f070 iommu/vt-d: Fix PCI bus rescan device hot add
commit 316f92a705 upstream.

Notifier calling chain uses priority to determine the execution
order of the notifiers or listeners registered to the chain.
PCI bus device hot add utilizes the notification mechanism.

The current code sets low priority (INT_MIN) to Intel
dmar_pci_bus_notifier and postpones DMAR decoding after adding
new device into IOMMU. The result is that struct device pointer
cannot be found in DRHD search for the new device's DMAR/IOMMU.
Subsequently, the device is put under the "catch-all" IOMMU
instead of the correct one. This could cause system hang when
device TLB invalidation is sent to the wrong IOMMU. Invalidation
timeout error and hard lockup have been observed and data
inconsistency/crush may occur as well.

This patch fixes the issue by setting a positive priority(1) for
dmar_pci_bus_notifier while the priority of IOMMU bus notifier
uses the default value(0), therefore DMAR decoding will be in
advance of DRHD search for a new device to find the correct IOMMU.

Following is a 2-step example that triggers the bug by simulating
PCI device hot add behavior in Intel Sapphire Rapids server.

echo 1 > /sys/bus/pci/devices/0000:6a:01.0/remove
echo 1 > /sys/bus/pci/rescan

Fixes: 59ce0515cd ("iommu/vt-d: Update DRHD/RMRR/ATSR device scope")
Cc: stable@vger.kernel.org # v3.15+
Reported-by: Zhang, Bernice <bernice.zhang@intel.com>
Signed-off-by: Jacob Pan <jacob.jun.pan@linux.intel.com>
Signed-off-by: Yian Chen <yian.chen@intel.com>
Link: https://lore.kernel.org/r/20220521002115.1624069-1-yian.chen@intel.com
Signed-off-by: Joerg Roedel <jroedel@suse.de>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2022-07-12 16:32:18 +02:00
..
amd iommu/amd: Increase timeout waiting for GA log enablement 2022-06-09 10:21:20 +02:00
arm iommu/arm-smmu-v3: check return value after calling platform_get_resource() 2022-06-14 18:32:38 +02:00
intel iommu/vt-d: Fix PCI bus rescan device hot add 2022-07-12 16:32:18 +02:00
dma-iommu.c iommu/dma: Fix compile warning in 32-bit builds 2021-07-14 16:56:55 +02:00
exynos-iommu.c iommu/exynos: add missing put_device() call in exynos_iommu_of_xlate() 2020-09-24 10:48:29 +02:00
fsl_pamu_domain.c iommu/pamu: Use dev_iommu_priv_get/set() 2020-06-30 11:59:48 +02:00
fsl_pamu_domain.h
fsl_pamu.c iommu/pamu: Replace use of kzfree with kfree_sensitive 2020-09-18 10:59:04 +02:00
fsl_pamu.h
hyperv-iommu.c x86_ioapic_Consolidate_IOAPIC_allocation 2020-09-16 16:52:32 +02:00
io-pgtable-arm-v7s.c iommu/io-pgtable-arm-v7s: Add error handle for page table allocation failure 2022-01-27 10:53:43 +01:00
io-pgtable-arm.c iommu/io-pgtable-arm: Fix table descriptor paddr formatting 2022-01-27 10:54:06 +01:00
io-pgtable-arm.h iommu/io-pgtable-arm: Move some definitions to a header 2020-09-28 23:48:06 +01:00
io-pgtable.c iommu/io-pgtable-arm: Rationalise TCR handling 2020-01-10 15:52:24 +00:00
ioasid.c
iommu-debugfs.c
iommu-sysfs.c drivers/iommu: Export core IOMMU API symbols to permit modular drivers 2019-12-23 14:06:05 +01:00
iommu-traces.c
iommu.c iommu: Fix potential use-after-free during probe 2022-02-16 12:54:31 +01:00
iova.c iommu/iova: Improve 32-bit free space estimate 2022-04-08 14:39:48 +02:00
ipmmu-vmsa.c iommu/ipmmu-vmsa: Check for error num after setting mask 2022-04-08 14:40:15 +02:00
irq_remapping.c iommu/irq_remapping: Consolidate irq domain lookup 2020-09-16 16:52:30 +02:00
irq_remapping.h iommu/irq_remapping: Consolidate irq domain lookup 2020-09-16 16:52:30 +02:00
Kconfig Merge branches 'arm/allwinner', 'arm/mediatek', 'arm/renesas', 'arm/tegra', 'arm/qcom', 'arm/smmu', 'ppc/pamu', 'x86/amd', 'x86/vt-d' and 'core' into next 2020-10-07 11:51:59 +02:00
Makefile More Arm SMMU updates for 5.9 2020-07-29 14:47:37 +02:00
msm_iommu_hw-8xxx.h
msm_iommu.c iommu/msm: Fix an incorrect NULL check on list iterator 2022-06-09 10:21:26 +02:00
msm_iommu.h
mtk_iommu_v1.c iommu/mediatek: Do no use dev->archdata.iommu 2020-06-30 11:59:48 +02:00
mtk_iommu.c iommu/mediatek: Add list_del in mtk_iommu_remove 2022-06-09 10:21:18 +02:00
mtk_iommu.h iommu/mediatek: Add support for MT8167 2020-09-18 10:29:12 +02:00
of_iommu.c of/device: Add input id to of_dma_configure() 2020-07-28 15:51:32 +01:00
omap-iommu-debug.c iommu/omap: Check for failure of a call to omap_iommu_dump_ctx 2020-07-22 15:02:33 +02:00
omap-iommu.c iommu/omap: Fix regression in probe for NULL pointer dereference 2022-04-13 21:01:07 +02:00
omap-iommu.h
omap-iopgtable.h iommu/omap: Fix -Woverflow warnings when compiling on 64-bit architectures 2020-03-04 16:24:46 +01:00
rockchip-iommu.c iommu/rockchip: Use dev_iommu_priv_get/set() 2020-06-30 11:59:48 +02:00
s390-iommu.c s390 updates for the 5.8 merge window 2020-06-08 12:05:31 -07:00
sun50i-iommu.c iommu/sun50i: Fix set-but-not-used variable warning 2020-09-04 13:39:45 +02:00
tegra-gart.c iommu/tegra: Use dev_iommu_priv_get/set() 2020-06-30 11:59:48 +02:00
tegra-smmu.c iommu/tegra-smmu: Allow to group clients in same swgroup 2020-09-24 12:32:32 +02:00
virtio-iommu.c iommu/virtio: Add missing MODULE_DEVICE_TABLE 2021-06-03 09:00:49 +02:00