Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Merge tag 'iommu-fixes-v3.17-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/joro/iommu

Pull IOMMU fixes from Joerg Roedel:
"The fixes include:

- fix a crash in the VT-d driver when devices with a driver attached
are hot-unplugged

- fix a AMD IOMMU driver crash with device assignment of 32 bit PCI
devices to KVM guests

- fix for a copy&paste error in generic IOMMU code. Now the right
function pointer is checked before calling"

* tag 'iommu-fixes-v3.17-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/joro/iommu:
iommu/core: Check for the right function pointer in iommu_map()
iommu/amd: Fix cleanup_domain for mass device removal
iommu/vt-d: Defer domain removal if device is assigned to a driver

+15 -5
+6 -4
drivers/iommu/amd_iommu.c
··· 3149 3149 3150 3150 static void cleanup_domain(struct protection_domain *domain) 3151 3151 { 3152 - struct iommu_dev_data *dev_data, *next; 3152 + struct iommu_dev_data *entry; 3153 3153 unsigned long flags; 3154 3154 3155 3155 write_lock_irqsave(&amd_iommu_devtable_lock, flags); 3156 3156 3157 - list_for_each_entry_safe(dev_data, next, &domain->dev_list, list) { 3158 - __detach_device(dev_data); 3159 - atomic_set(&dev_data->bind, 0); 3157 + while (!list_empty(&domain->dev_list)) { 3158 + entry = list_first_entry(&domain->dev_list, 3159 + struct iommu_dev_data, list); 3160 + __detach_device(entry); 3161 + atomic_set(&entry->bind, 0); 3160 3162 } 3161 3163 3162 3164 write_unlock_irqrestore(&amd_iommu_devtable_lock, flags);
+8
drivers/iommu/intel-iommu.c
··· 3869 3869 action != BUS_NOTIFY_DEL_DEVICE) 3870 3870 return 0; 3871 3871 3872 + /* 3873 + * If the device is still attached to a device driver we can't 3874 + * tear down the domain yet as DMA mappings may still be in use. 3875 + * Wait for the BUS_NOTIFY_UNBOUND_DRIVER event to do that. 3876 + */ 3877 + if (action == BUS_NOTIFY_DEL_DEVICE && dev->driver != NULL) 3878 + return 0; 3879 + 3872 3880 domain = find_domain(dev); 3873 3881 if (!domain) 3874 3882 return 0;
+1 -1
drivers/iommu/iommu.c
··· 995 995 size_t orig_size = size; 996 996 int ret = 0; 997 997 998 - if (unlikely(domain->ops->unmap == NULL || 998 + if (unlikely(domain->ops->map == NULL || 999 999 domain->ops->pgsize_bitmap == 0UL)) 1000 1000 return -ENODEV; 1001 1001