iommu/vt-d: Fix reference count in iommu_prepare_isa
[firefly-linux-kernel-4.4.55.git] / drivers / iommu / intel-iommu.c
index 6bb32773c3ac3471ab7bf439d9191be757bacb5c..9b9f28ea3db25651388ff7766219996354442b42 100644 (file)
@@ -892,7 +892,7 @@ static struct dma_pte *dma_pfn_level_pte(struct dmar_domain *domain,
                        break;
                }
 
-               if (pte->val & DMA_PTE_LARGE_PAGE) {
+               if (dma_pte_superpage(pte)) {
                        *large_page = total;
                        return pte;
                }
@@ -2102,13 +2102,11 @@ static inline void unlink_domain_info(struct device_domain_info *info)
 
 static void domain_remove_dev_info(struct dmar_domain *domain)
 {
-       struct device_domain_info *info;
+       struct device_domain_info *info, *tmp;
        unsigned long flags, flags2;
 
        spin_lock_irqsave(&device_domain_lock, flags);
-       while (!list_empty(&domain->devices)) {
-               info = list_entry(domain->devices.next,
-                       struct device_domain_info, link);
+       list_for_each_entry_safe(info, tmp, &domain->devices, link) {
                unlink_domain_info(info);
                spin_unlock_irqrestore(&device_domain_lock, flags);
 
@@ -2405,6 +2403,7 @@ static inline void iommu_prepare_isa(void)
                printk(KERN_ERR "IOMMU: Failed to create 0-16MiB identity map; "
                       "floppy might not work\n");
 
+       pci_dev_put(pdev);
 }
 #else
 static inline void iommu_prepare_isa(void)
@@ -3816,14 +3815,11 @@ int dmar_iommu_notify_scope_dev(struct dmar_pci_notify_info *info)
                                ((void *)rmrr) + rmrr->header.length,
                                rmrr->segment, rmrru->devices,
                                rmrru->devices_cnt);
-                       if (ret > 0)
-                               break;
-                       else if(ret < 0)
+                       if(ret < 0)
                                return ret;
                } else if (info->event == BUS_NOTIFY_DEL_DEVICE) {
-                       if (dmar_remove_dev_scope(info, rmrr->segment,
-                               rmrru->devices, rmrru->devices_cnt))
-                               break;
+                       dmar_remove_dev_scope(info, rmrr->segment,
+                               rmrru->devices, rmrru->devices_cnt);
                }
        }
 
@@ -4153,7 +4149,6 @@ static int md_domain_init(struct dmar_domain *domain, int guest_width)
        domain->iommu_snooping = 0;
        domain->iommu_superpage = 0;
        domain->max_addr = 0;
-       domain->nid = -1;
 
        /* always allocate the top pgd */
        domain->pgd = (struct dma_pte *)alloc_pgtable_page(domain->nid);