|
Joerg Roedel |
a75855 |
From: Bartosz Golaszewski <bgolaszewski@baylibre.com>
|
|
Joerg Roedel |
a75855 |
Date: Tue, 13 Oct 2020 09:30:55 +0200
|
|
Joerg Roedel |
a75855 |
Subject: iommu/vt-d: Don't dereference iommu_device if IOMMU_API is not built
|
|
Joerg Roedel |
a75855 |
MIME-Version: 1.0
|
|
Joerg Roedel |
a75855 |
Content-Type: text/plain; charset=UTF-8
|
|
Joerg Roedel |
a75855 |
Content-Transfer-Encoding: 8bit
|
|
Joerg Roedel |
a75855 |
Git-commit: 9def3b1a07c41e21c68a0eb353e3e569fdd1d2b1
|
|
Joerg Roedel |
a75855 |
Patch-mainline: v5.10-rc1
|
|
Joerg Roedel |
a75855 |
References: bsc#1181001, jsc#ECO-3191
|
|
Joerg Roedel |
a75855 |
|
|
Joerg Roedel |
a75855 |
Since commit c40aaaac1018 ("iommu/vt-d: Gracefully handle DMAR units
|
|
Joerg Roedel |
a75855 |
with no supported address widths") dmar.c needs struct iommu_device to
|
|
Joerg Roedel |
a75855 |
be selected. We can drop this dependency by not dereferencing struct
|
|
Joerg Roedel |
a75855 |
iommu_device if IOMMU_API is not selected and by reusing the information
|
|
Joerg Roedel |
a75855 |
stored in iommu->drhd->ignored instead.
|
|
Joerg Roedel |
a75855 |
|
|
Joerg Roedel |
a75855 |
This fixes the following build error when IOMMU_API is not selected:
|
|
Joerg Roedel |
a75855 |
|
|
Joerg Roedel |
a75855 |
drivers/iommu/dmar.c: In function ‘free_iommu’:
|
|
Joerg Roedel |
a75855 |
drivers/iommu/dmar.c:1139:41: error: ‘struct iommu_device’ has no member named ‘ops’
|
|
Joerg Roedel |
a75855 |
1139 | if (intel_iommu_enabled && iommu->iommu.ops) {
|
|
Joerg Roedel |
a75855 |
^
|
|
Joerg Roedel |
a75855 |
|
|
Joerg Roedel |
a75855 |
Fixes: c40aaaac1018 ("iommu/vt-d: Gracefully handle DMAR units with no supported address widths")
|
|
Joerg Roedel |
a75855 |
Signed-off-by: Bartosz Golaszewski <bgolaszewski@baylibre.com>
|
|
Joerg Roedel |
a75855 |
Acked-by: Lu Baolu <baolu.lu@linux.intel.com>
|
|
Joerg Roedel |
a75855 |
Acked-by: David Woodhouse <dwmw@amazon.co.uk>
|
|
Joerg Roedel |
a75855 |
Link: https://lore.kernel.org/r/20201013073055.11262-1-brgl@bgdev.pl
|
|
Joerg Roedel |
a75855 |
Signed-off-by: Joerg Roedel <jroedel@suse.de>
|
|
Joerg Roedel |
a75855 |
---
|
|
Joerg Roedel |
a75855 |
drivers/iommu/dmar.c | 3 ++-
|
|
Joerg Roedel |
a75855 |
include/linux/intel-iommu.h | 2 ++
|
|
Joerg Roedel |
a75855 |
2 files changed, 4 insertions(+), 1 deletion(-)
|
|
Joerg Roedel |
a75855 |
|
|
Joerg Roedel |
a75855 |
--- a/drivers/iommu/dmar.c
|
|
Joerg Roedel |
a75855 |
+++ b/drivers/iommu/dmar.c
|
|
Joerg Roedel |
a75855 |
@@ -1125,6 +1125,7 @@ static int alloc_iommu(struct dmar_drhd_
|
|
Joerg Roedel |
a75855 |
}
|
|
Joerg Roedel |
a75855 |
|
|
Joerg Roedel |
a75855 |
drhd->iommu = iommu;
|
|
Joerg Roedel |
a75855 |
+ iommu->drhd = drhd;
|
|
Joerg Roedel |
a75855 |
|
|
Joerg Roedel |
a75855 |
return 0;
|
|
Joerg Roedel |
a75855 |
|
|
Joerg Roedel |
a75855 |
@@ -1139,7 +1140,7 @@ error:
|
|
Joerg Roedel |
a75855 |
|
|
Joerg Roedel |
a75855 |
static void free_iommu(struct intel_iommu *iommu)
|
|
Joerg Roedel |
a75855 |
{
|
|
Joerg Roedel |
a75855 |
- if (intel_iommu_enabled && iommu->iommu.ops) {
|
|
Joerg Roedel |
a75855 |
+ if (intel_iommu_enabled && !iommu->drhd->ignored) {
|
|
Joerg Roedel |
a75855 |
iommu_device_unregister(&iommu->iommu);
|
|
Joerg Roedel |
a75855 |
iommu_device_sysfs_remove(&iommu->iommu);
|
|
Joerg Roedel |
a75855 |
}
|
|
Joerg Roedel |
a75855 |
--- a/include/linux/intel-iommu.h
|
|
Joerg Roedel |
a75855 |
+++ b/include/linux/intel-iommu.h
|
|
Joerg Roedel |
a75855 |
@@ -435,6 +435,8 @@ struct intel_iommu {
|
|
Joerg Roedel |
a75855 |
struct iommu_device iommu; /* IOMMU core code handle */
|
|
Joerg Roedel |
a75855 |
int node;
|
|
Joerg Roedel |
a75855 |
u32 flags; /* Software defined flags */
|
|
Joerg Roedel |
a75855 |
+
|
|
Joerg Roedel |
a75855 |
+ struct dmar_drhd_unit *drhd;
|
|
Joerg Roedel |
a75855 |
};
|
|
Joerg Roedel |
a75855 |
|
|
Joerg Roedel |
a75855 |
static inline void __iommu_flush_cache(
|