diff --git a/drivers/iommu/dmar.c b/drivers/iommu/dmar.c index a5f69d9bb0b8..1b9795743276 100644 --- a/drivers/iommu/dmar.c +++ b/drivers/iommu/dmar.c @@ -1114,6 +1114,7 @@ static int alloc_iommu(struct dmar_drhd_unit *drhd) } drhd->iommu = iommu; + iommu->drhd = drhd; return 0; @@ -1128,7 +1129,7 @@ error: static void free_iommu(struct intel_iommu *iommu) { - if (intel_iommu_enabled && iommu->iommu.ops) { + if (intel_iommu_enabled && !iommu->drhd->ignored) { iommu_device_unregister(&iommu->iommu); iommu_device_sysfs_remove(&iommu->iommu); } diff --git a/include/linux/intel-iommu.h b/include/linux/intel-iommu.h index 6b559d25a84e..88ac8edf44e3 100644 --- a/include/linux/intel-iommu.h +++ b/include/linux/intel-iommu.h @@ -556,6 +556,8 @@ struct intel_iommu { struct iommu_device iommu; /* IOMMU core code handle */ int node; u32 flags; /* Software defined flags */ + + struct dmar_drhd_unit *drhd; }; /* PCI domain-device relationship */