With specific Linux command line option such as "iommu=pt", some types of hotplug devices will be assigned to the static 1:1 iommu domain by default during kernel init.
If such a hotplug device is rescanned after being removed, for example, with following sample commands: echo 1 > /sys/bus/pci/devices/0000\:03\:00.1/remove echo 1 > /sys/bus/pci/rescan , an iommu group for this hotplug device will be added without attaching it to the default static 1:1 domain. As a result, this device's I/O operation won't work. Keep hotplug devices with default static 1:1 iommu mapping in their default domain after such hotplug devices are rescanned. Signed-off-by: James Dong <xmd...@google.com> Reported-by: Jis Ben <jis...@google.com> --- drivers/iommu/intel-iommu.c | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/drivers/iommu/intel-iommu.c b/drivers/iommu/intel-iommu.c index 78188bf7e90d..4b02949e58ca 100644 --- a/drivers/iommu/intel-iommu.c +++ b/drivers/iommu/intel-iommu.c @@ -5230,6 +5230,7 @@ static int intel_iommu_add_device(struct device *dev) struct intel_iommu *iommu; struct iommu_group *group; u8 bus, devfn; + int ret = 0; iommu = device_to_iommu(dev, &bus, &devfn); if (!iommu) @@ -5242,8 +5243,19 @@ static int intel_iommu_add_device(struct device *dev) if (IS_ERR(group)) return PTR_ERR(group); + if (!iommu_group_default_domain(group) && + !find_domain(dev) && iommu_should_identity_map(dev, 0)) { + ret = domain_add_dev_info(si_domain, dev); + if (!ret) + pr_info("identity mapping for device %s\n", + dev_name(dev)); + else + pr_info("identity mapping failed (%d) for device %s\n", + ret, dev_name(dev)); + } + iommu_group_put(group); - return 0; + return ret; } static void intel_iommu_remove_device(struct device *dev) -- 2.21.0.rc0.258.g878e2cd30e-goog _______________________________________________ iommu mailing list iommu@lists.linux-foundation.org https://lists.linuxfoundation.org/mailman/listinfo/iommu