iommu/vt-d: Move context-mapping into dmar_insert_dev_info

Do the context-mapping of devices from a single place in the
call-path and clean up the other call-sites.

Signed-off-by: Joerg Roedel <jroedel@suse.de>
This commit is contained in:
Joerg Roedel 2015-07-22 10:04:36 +02:00
parent 76f45fe35c
commit cc4e2575cc
1 changed files with 8 additions and 25 deletions

View File

@ -2327,6 +2327,12 @@ static struct dmar_domain *dmar_insert_dev_info(struct intel_iommu *iommu,
dev->archdata.iommu = info; dev->archdata.iommu = info;
spin_unlock_irqrestore(&device_domain_lock, flags); spin_unlock_irqrestore(&device_domain_lock, flags);
if (dev && domain_context_mapping(domain, dev)) {
pr_err("Domain context map for %s failed\n", dev_name(dev));
domain_remove_one_dev_info(domain, dev);
return NULL;
}
return domain; return domain;
} }
@ -2339,11 +2345,11 @@ static int get_last_alias(struct pci_dev *pdev, u16 alias, void *opaque)
/* domain is initialized */ /* domain is initialized */
static struct dmar_domain *get_domain_for_dev(struct device *dev, int gaw) static struct dmar_domain *get_domain_for_dev(struct device *dev, int gaw)
{ {
struct device_domain_info *info = NULL;
struct dmar_domain *domain, *tmp; struct dmar_domain *domain, *tmp;
struct intel_iommu *iommu; struct intel_iommu *iommu;
struct device_domain_info *info;
u16 dma_alias;
unsigned long flags; unsigned long flags;
u16 dma_alias;
u8 bus, devfn; u8 bus, devfn;
domain = find_domain(dev); domain = find_domain(dev);
@ -2492,11 +2498,6 @@ static int iommu_prepare_identity_map(struct device *dev,
if (ret) if (ret)
goto error; goto error;
/* context entry init */
ret = domain_context_mapping(domain, dev);
if (ret)
goto error;
return 0; return 0;
error: error:
@ -2592,7 +2593,6 @@ static int domain_add_dev_info(struct dmar_domain *domain, struct device *dev)
struct dmar_domain *ndomain; struct dmar_domain *ndomain;
struct intel_iommu *iommu; struct intel_iommu *iommu;
u8 bus, devfn; u8 bus, devfn;
int ret;
iommu = device_to_iommu(dev, &bus, &devfn); iommu = device_to_iommu(dev, &bus, &devfn);
if (!iommu) if (!iommu)
@ -2602,12 +2602,6 @@ static int domain_add_dev_info(struct dmar_domain *domain, struct device *dev)
if (ndomain != domain) if (ndomain != domain)
return -EBUSY; return -EBUSY;
ret = domain_context_mapping(domain, dev);
if (ret) {
domain_remove_one_dev_info(domain, dev);
return ret;
}
return 0; return 0;
} }
@ -3263,7 +3257,6 @@ static struct iova *intel_alloc_iova(struct device *dev,
static struct dmar_domain *__get_valid_domain_for_dev(struct device *dev) static struct dmar_domain *__get_valid_domain_for_dev(struct device *dev)
{ {
struct dmar_domain *domain; struct dmar_domain *domain;
int ret;
domain = get_domain_for_dev(dev, DEFAULT_DOMAIN_ADDRESS_WIDTH); domain = get_domain_for_dev(dev, DEFAULT_DOMAIN_ADDRESS_WIDTH);
if (!domain) { if (!domain) {
@ -3272,16 +3265,6 @@ static struct dmar_domain *__get_valid_domain_for_dev(struct device *dev)
return NULL; return NULL;
} }
/* make sure context mapping is ok */
if (unlikely(!domain_context_mapped(dev))) {
ret = domain_context_mapping(domain, dev);
if (ret) {
pr_err("Domain context map for %s failed\n",
dev_name(dev));
return NULL;
}
}
return domain; return domain;
} }