Commit c2a2876e authored by Joerg Roedel's avatar Joerg Roedel

iommu/amd: Make sure dma_ops are set for hotplug devices

There is a bug introduced with commit 27c2127 that causes
devices which are hot unplugged and then hot-replugged to
not have per-device dma_ops set. This causes these devices
to not function correctly. Fixed with this patch.

Cc: stable@vger.kernel.org
Reported-by: default avatarAndreas Degert <andreas.degert@googlemail.com>
Signed-off-by: default avatarJoerg Roedel <joro@8bytes.org>
parent 4fdc7824
...@@ -2466,18 +2466,16 @@ static int device_change_notifier(struct notifier_block *nb, ...@@ -2466,18 +2466,16 @@ static int device_change_notifier(struct notifier_block *nb,
/* allocate a protection domain if a device is added */ /* allocate a protection domain if a device is added */
dma_domain = find_protection_domain(devid); dma_domain = find_protection_domain(devid);
if (dma_domain) if (!dma_domain) {
goto out; dma_domain = dma_ops_domain_alloc();
dma_domain = dma_ops_domain_alloc(); if (!dma_domain)
if (!dma_domain) goto out;
goto out; dma_domain->target_dev = devid;
dma_domain->target_dev = devid;
spin_lock_irqsave(&iommu_pd_list_lock, flags);
spin_lock_irqsave(&iommu_pd_list_lock, flags); list_add_tail(&dma_domain->list, &iommu_pd_list);
list_add_tail(&dma_domain->list, &iommu_pd_list); spin_unlock_irqrestore(&iommu_pd_list_lock, flags);
spin_unlock_irqrestore(&iommu_pd_list_lock, flags); }
dev_data = get_dev_data(dev);
dev->archdata.dma_ops = &amd_iommu_dma_ops; dev->archdata.dma_ops = &amd_iommu_dma_ops;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment