Showing error 573

User: Jiri Slaby
Error type: Double Lock
Error type description: Some lock is locked twice unintentionally in a sequence
File location: drivers/pci/intel-iommu.c
Line in file: 1300
Project: Linux Kernel
Project version: 2.6.28
Confirmation: Fixed by 00dfff77e7184140dc45724c7232e99302f6bf97
Tools: Stanse (1.2)
Entered: 2011-11-07 22:19:59 UTC


Source:

1270                pte = addr_to_dma_pte(domain, iova + VTD_PAGE_SIZE * index);
1271                if (!pte)
1272                        return -ENOMEM;
1273                /* We don't need lock here, nobody else
1274                 * touches the iova range
1275                 */
1276                BUG_ON(dma_pte_addr(*pte));
1277                dma_set_pte_addr(*pte, start_pfn << VTD_PAGE_SHIFT);
1278                dma_set_pte_prot(*pte, prot);
1279                __iommu_flush_cache(domain->iommu, pte, sizeof(*pte));
1280                start_pfn++;
1281                index++;
1282        }
1283        return 0;
1284}
1285
1286static void detach_domain_for_dev(struct dmar_domain *domain, u8 bus, u8 devfn)
1287{
1288        clear_context_table(domain->iommu, bus, devfn);
1289        domain->iommu->flush.flush_context(domain->iommu, 0, 0, 0,
1290                                           DMA_CCMD_GLOBAL_INVL, 0);
1291        domain->iommu->flush.flush_iotlb(domain->iommu, 0, 0, 0,
1292                                         DMA_TLB_GLOBAL_FLUSH, 0);
1293}
1294
1295static void domain_remove_dev_info(struct dmar_domain *domain)
1296{
1297        struct device_domain_info *info;
1298        unsigned long flags;
1299
1300        spin_lock_irqsave(&device_domain_lock, flags);
1301        while (!list_empty(&domain->devices)) {
1302                info = list_entry(domain->devices.next,
1303                        struct device_domain_info, link);
1304                list_del(&info->link);
1305                list_del(&info->global);
1306                if (info->dev)
1307                        info->dev->dev.archdata.iommu = NULL;
1308                spin_unlock_irqrestore(&device_domain_lock, flags);
1309
1310                detach_domain_for_dev(info->domain, info->bus, info->devfn);
Show full sources