From mboxrd@z Thu Jan 1 00:00:00 1970 From: Muli Ben-Yehuda Subject: Re: [PATCH 2/4][VTD] modifications to intel-iommu.c. Date: Tue, 10 Jun 2008 13:14:57 +0300 Message-ID: <20080610101457.GF7307@il.ibm.com> References: <1FE6DD409037234FAB833C420AA843EC018831CF@orsmsx424.amr.corp.intel.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Cc: kvm@vger.kernel.org, Amit Shah , Ben-Ami Yassour1 , Avi Kivity , Anthony Liguori , Chris Wright , "Han, Weidong" To: "Kay, Allen M" Return-path: Received: from mtagate5.de.ibm.com ([195.212.29.154]:34836 "EHLO mtagate5.de.ibm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1758158AbYFJKPr (ORCPT ); Tue, 10 Jun 2008 06:15:47 -0400 Received: from d12nrmr1607.megacenter.de.ibm.com (d12nrmr1607.megacenter.de.ibm.com [9.149.167.49]) by mtagate5.de.ibm.com (8.13.8/8.13.8) with ESMTP id m5AAF2V5417418 for ; Tue, 10 Jun 2008 10:15:02 GMT Received: from d12av03.megacenter.de.ibm.com (d12av03.megacenter.de.ibm.com [9.149.165.213]) by d12nrmr1607.megacenter.de.ibm.com (8.13.8/8.13.8/NCO v9.0) with ESMTP id m5AAF2PY3571798 for ; Tue, 10 Jun 2008 12:15:02 +0200 Received: from d12av03.megacenter.de.ibm.com (loopback [127.0.0.1]) by d12av03.megacenter.de.ibm.com (8.12.11.20060308/8.13.3) with ESMTP id m5AAF15k010065 for ; Tue, 10 Jun 2008 12:15:02 +0200 Content-Disposition: inline In-Reply-To: <1FE6DD409037234FAB833C420AA843EC018831CF@orsmsx424.amr.corp.intel.com> Sender: kvm-owner@vger.kernel.org List-ID: On Mon, Jun 09, 2008 at 05:41:29PM -0700, Kay, Allen M wrote: > Modification to intel-iommu.c to support vt-d page table and context > table mapping in kvm. Mods to dmar.c and iova.c are due to header > file moves to include/linux. Hi Allen, Minor comments below, patches to follow up. > Signed-off-by: Allen M. Kay > > diff --git a/drivers/pci/intel-iommu.c b/drivers/pci/intel-iommu.c > index 66c0fd2..a694e62 100644 > --- a/drivers/pci/intel-iommu.c > +++ b/drivers/pci/intel-iommu.c > @@ -20,6 +20,7 @@ > * Author: Anil S Keshavamurthy > */ > > +#undef DEBUG Nit: this should be submitted upstream seperately. > #include > #include > #include > @@ -33,8 +34,8 @@ > #include > #include > #include > -#include "iova.h" > -#include "intel-iommu.h" > +#include > +#include > #include /* force_iommu in this header in x86-64*/ > #include > #include > @@ -160,7 +161,7 @@ static inline void *alloc_domain_mem(void) > return iommu_kmem_cache_alloc(iommu_domain_cache); > } > > -static inline void free_domain_mem(void *vaddr) > +static void free_domain_mem(void *vaddr) > { > kmem_cache_free(iommu_domain_cache, vaddr); > } > @@ -1263,11 +1264,8 @@ static int domain_context_mapping_one(struct dmar_domain *domain, > if (!context) > return -ENOMEM; > spin_lock_irqsave(&iommu->lock, flags); > - if (context_present(*context)) { > - spin_unlock_irqrestore(&iommu->lock, flags); > - return 0; > - } > > + context_clear_entry(*context); > context_set_domain_id(*context, domain->id); > context_set_address_width(*context, domain->agaw); > context_set_address_root(*context, virt_to_phys(domain->pgd)); > @@ -1414,7 +1412,7 @@ static void domain_remove_dev_info(struct dmar_domain *domain) > * find_domain > * Note: we use struct pci_dev->dev.archdata.iommu stores the info > */ > -struct dmar_domain * > +static struct dmar_domain * > find_domain(struct pci_dev *pdev) > { > struct device_domain_info *info; > @@ -2408,3 +2406,96 @@ int __init intel_iommu_init(void) > return 0; > } > > +void kvm_intel_iommu_domain_exit(struct dmar_domain *domain) > +{ > + u64 end; > + > + /* Domain 0 is reserved, so dont process it */ > + if (!domain) > + return; > + > + end = DOMAIN_MAX_ADDR(domain->gaw); > + end = end & (~PAGE_MASK_4K); > + > + /* clear ptes */ > + dma_pte_clear_range(domain, 0, end); > + > + /* free page tables */ > + dma_pte_free_pagetable(domain, 0, end); > + > + iommu_free_domain(domain); > + free_domain_mem(domain); > +} > +EXPORT_SYMBOL_GPL(kvm_intel_iommu_domain_exit); > + > +struct dmar_domain *kvm_intel_iommu_domain_alloc(struct pci_dev *pdev) > +{ > + struct dmar_drhd_unit *drhd; > + struct dmar_domain *domain; > + struct intel_iommu *iommu; > + > + drhd = dmar_find_matched_drhd_unit(pdev); > + if (!drhd) { > + printk(KERN_ERR "kvm_intel_iommu_domain_alloc: drhd == NULL\n"); > + return NULL; > + } > + > + iommu = drhd->iommu; > + if (!iommu) { > + printk(KERN_ERR > + "kvm_intel_iommu_domain_alloc: iommu == NULL\n"); > + return NULL; > + } > + domain = iommu_alloc_domain(iommu); > + if (!domain) { > + printk(KERN_ERR > + "kvm_intel_iommu_domain_alloc: domain == NULL\n"); > + return NULL; > + } > + if (domain_init(domain, DEFAULT_DOMAIN_ADDRESS_WIDTH)) { > + printk(KERN_ERR > + "kvm_intel_iommu_domain_alloc: domain_init() failed\n"); > + kvm_intel_iommu_domain_exit(domain); > + return NULL; > + } > + return domain; > +} > +EXPORT_SYMBOL_GPL(kvm_intel_iommu_domain_alloc); > + > +int kvm_intel_iommu_context_mapping( > + struct dmar_domain *domain, struct pci_dev *pdev) > +{ > + int rc; > + rc = domain_context_mapping(domain, pdev); > + return rc; > +} Unnecessary wrapper. > +EXPORT_SYMBOL_GPL(kvm_intel_iommu_context_mapping); > + > +int kvm_intel_iommu_page_mapping( > + struct dmar_domain *domain, dma_addr_t iova, > + u64 hpa, size_t size, int prot) > +{ > + int rc; > + rc = domain_page_mapping(domain, iova, hpa, size, prot); > + return rc; > +} Unnecessary wrapper. > +EXPORT_SYMBOL_GPL(kvm_intel_iommu_page_mapping); > + > +void kvm_intel_iommu_detach_dev(struct dmar_domain *domain, u8 bus, u8 devfn) > +{ > + kvm_intel_iommu_detach_dev(domain, bus, devfn); > +} This doesn't look correct--we should probably tear down the domain's page tables and context here. > +EXPORT_SYMBOL_GPL(kvm_intel_iommu_detach_dev); > + > +struct dmar_domain * > +kvm_intel_iommu_find_domain(struct pci_dev *pdev) > +{ > + return find_domain(pdev); > +} Unnecessary wrapper. Cheers, Muli