lists.openwall.net | lists / announce owl-users owl-dev john-users john-dev passwdqc-users yescrypt popa3d-users / oss-security kernel-hardening musl sabotage tlsify passwords / crypt-dev xvendor / Bugtraq Full-Disclosure linux-kernel linux-netdev linux-ext4 linux-hardening linux-cve-announce PHC | |
Open Source and information security mailing list archives
| ||
|
Message-Id: <1191553705.28239.30.camel@pasglop> Date: Fri, 05 Oct 2007 13:08:25 +1000 From: Benjamin Herrenschmidt <benh@...nel.crashing.org> To: "Keshavamurthy, Anil S" <anil.s.keshavamurthy@...el.com> Cc: Linux Kernel <linux-kernel@...r.kernel.org>, akpm@...ux-foundation.org, Greg KH <greg@...ah.com>, muli@...ibm.com, paulus@...ba.org, kristen.c.accardi@...el.com Subject: Re: [patch take 2][Intel-IOMMU] Fix for IOMMU early crash > Subject: [Intel-IOMMU] Fix for IOMMU early crash > > pci_dev's->sysdata is highly overloaded and currently > IOMMU is broken due to IOMMU code depending on this field. > > This patch introduces new field in pci_dev's dev.archdata struct to > hold IOMMU specific per device IOMMU private data. > > Signed-off-by: Anil S Keshavamurthy <anil.s.keshavamurthy@...el.com> Looks good. Won't break powerpc. Acked-by: Benjamin Herrenschmidt <benh@...nel.crashing.org> > --- > drivers/pci/intel-iommu.c | 22 +++++++++++----------- > include/asm-x86_64/device.h | 3 +++ > 2 files changed, 14 insertions(+), 11 deletions(-) > > Index: 2.6-mm/drivers/pci/intel-iommu.c > =================================================================== > --- 2.6-mm.orig/drivers/pci/intel-iommu.c 2007-10-04 11:35:09.000000000 -0700 > +++ 2.6-mm/drivers/pci/intel-iommu.c 2007-10-04 11:47:47.000000000 -0700 > @@ -1348,7 +1348,7 @@ > list_del(&info->link); > list_del(&info->global); > if (info->dev) > - info->dev->sysdata = NULL; > + info->dev->dev.archdata.iommu = NULL; > spin_unlock_irqrestore(&device_domain_lock, flags); > > detach_domain_for_dev(info->domain, info->bus, info->devfn); > @@ -1361,7 +1361,7 @@ > > /* > * find_domain > - * Note: we use struct pci_dev->sysdata stores the info > + * Note: we use struct pci_dev->dev.archdata.iommu stores the info > */ > struct dmar_domain * > find_domain(struct pci_dev *pdev) > @@ -1369,7 +1369,7 @@ > struct device_domain_info *info; > > /* No lock here, assumes no domain exit in normal case */ > - info = pdev->sysdata; > + info = pdev->dev.archdata.iommu; > if (info) > return info->domain; > return NULL; > @@ -1519,7 +1519,7 @@ > } > list_add(&info->link, &domain->devices); > list_add(&info->global, &device_domain_list); > - pdev->sysdata = info; > + pdev->dev.archdata.iommu = info; > spin_unlock_irqrestore(&device_domain_lock, flags); > return domain; > error: > @@ -1579,7 +1579,7 @@ > static inline int iommu_prepare_rmrr_dev(struct dmar_rmrr_unit *rmrr, > struct pci_dev *pdev) > { > - if (pdev->sysdata == DUMMY_DEVICE_DOMAIN_INFO) > + if (pdev->dev.archdata.iommu == DUMMY_DEVICE_DOMAIN_INFO) > return 0; > return iommu_prepare_identity_map(pdev, rmrr->base_address, > rmrr->end_address + 1); > @@ -1595,7 +1595,7 @@ > int ret; > > for_each_pci_dev(pdev) { > - if (pdev->sysdata == DUMMY_DEVICE_DOMAIN_INFO || > + if (pdev->dev.archdata.iommu == DUMMY_DEVICE_DOMAIN_INFO || > !IS_GFX_DEVICE(pdev)) > continue; > printk(KERN_INFO "IOMMU: gfx device %s 1-1 mapping\n", > @@ -1836,7 +1836,7 @@ > int prot = 0; > > BUG_ON(dir == DMA_NONE); > - if (pdev->sysdata == DUMMY_DEVICE_DOMAIN_INFO) > + if (pdev->dev.archdata.iommu == DUMMY_DEVICE_DOMAIN_INFO) > return virt_to_bus(addr); > > domain = get_valid_domain_for_dev(pdev); > @@ -1900,7 +1900,7 @@ > unsigned long start_addr; > struct iova *iova; > > - if (pdev->sysdata == DUMMY_DEVICE_DOMAIN_INFO) > + if (pdev->dev.archdata.iommu == DUMMY_DEVICE_DOMAIN_INFO) > return; > domain = find_domain(pdev); > BUG_ON(!domain); > @@ -1974,7 +1974,7 @@ > size_t size = 0; > void *addr; > > - if (pdev->sysdata == DUMMY_DEVICE_DOMAIN_INFO) > + if (pdev->dev.archdata.iommu == DUMMY_DEVICE_DOMAIN_INFO) > return; > > domain = find_domain(pdev); > @@ -2032,7 +2032,7 @@ > unsigned long start_addr; > > BUG_ON(dir == DMA_NONE); > - if (pdev->sysdata == DUMMY_DEVICE_DOMAIN_INFO) > + if (pdev->dev.archdata.iommu == DUMMY_DEVICE_DOMAIN_INFO) > return intel_nontranslate_map_sg(hwdev, sg, nelems, dir); > > domain = get_valid_domain_for_dev(pdev); > @@ -2234,7 +2234,7 @@ > for (i = 0; i < drhd->devices_cnt; i++) { > if (!drhd->devices[i]) > continue; > - drhd->devices[i]->sysdata = DUMMY_DEVICE_DOMAIN_INFO; > + drhd->devices[i]->dev.archdata.iommu = DUMMY_DEVICE_DOMAIN_INFO; > } > } > } > Index: 2.6-mm/include/asm-x86_64/device.h > =================================================================== > --- 2.6-mm.orig/include/asm-x86_64/device.h 2007-10-04 11:35:09.000000000 -0700 > +++ 2.6-mm/include/asm-x86_64/device.h 2007-10-04 11:49:44.000000000 -0700 > @@ -10,6 +10,9 @@ > #ifdef CONFIG_ACPI > void *acpi_handle; > #endif > +#ifdef CONFIG_DMAR > + void *iommu; /* hook for IOMMU specific extension */ > +#endif > }; > > #endif /* _ASM_X86_64_DEVICE_H */ - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@...r.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
Powered by blists - more mailing lists