Skip to content

Commit

Permalink
iommu/vt-d: Avoid iova flush queue in strict mode
Browse files Browse the repository at this point in the history
If Intel IOMMU strict mode is enabled by users, it's unnecessary
to create the iova flush queue.

Signed-off-by: Lu Baolu <baolu.lu@linux.intel.com>
Signed-off-by: Joerg Roedel <jroedel@suse.de>
  • Loading branch information
Lu Baolu authored and Joerg Roedel committed Jan 7, 2020
1 parent 984d03a commit 10f8008
Showing 1 changed file with 15 additions and 9 deletions.
24 changes: 15 additions & 9 deletions drivers/iommu/intel-iommu.c
Original file line number Diff line number Diff line change
Expand Up @@ -1858,10 +1858,12 @@ static int domain_init(struct dmar_domain *domain, struct intel_iommu *iommu,

init_iova_domain(&domain->iovad, VTD_PAGE_SIZE, IOVA_START_PFN);

err = init_iova_flush_queue(&domain->iovad,
iommu_flush_iova, iova_entry_free);
if (err)
return err;
if (!intel_iommu_strict) {
err = init_iova_flush_queue(&domain->iovad,
iommu_flush_iova, iova_entry_free);
if (err)
return err;
}

domain_reserve_special_ranges(domain);

Expand Down Expand Up @@ -5199,6 +5201,7 @@ static struct iommu_domain *intel_iommu_domain_alloc(unsigned type)
{
struct dmar_domain *dmar_domain;
struct iommu_domain *domain;
int ret;

switch (type) {
case IOMMU_DOMAIN_DMA:
Expand All @@ -5215,11 +5218,14 @@ static struct iommu_domain *intel_iommu_domain_alloc(unsigned type)
return NULL;
}

if (type == IOMMU_DOMAIN_DMA &&
init_iova_flush_queue(&dmar_domain->iovad,
iommu_flush_iova, iova_entry_free)) {
pr_warn("iova flush queue initialization failed\n");
intel_iommu_strict = 1;
if (!intel_iommu_strict && type == IOMMU_DOMAIN_DMA) {
ret = init_iova_flush_queue(&dmar_domain->iovad,
iommu_flush_iova,
iova_entry_free);
if (ret) {
pr_warn("iova flush queue initialization failed\n");
intel_iommu_strict = 1;
}
}

domain_update_iommu_cap(dmar_domain);
Expand Down

0 comments on commit 10f8008

Please sign in to comment.