diff options
author | Andy Shevchenko <andriy.shevchenko@linux.intel.com> | 2017-02-15 16:42:21 +0200 |
---|---|---|
committer | Joerg Roedel <jroedel@suse.de> | 2017-02-22 12:25:31 +0100 |
commit | c37a01779b3954d9c8f9ac4f663a03c11f69fded (patch) | |
tree | ee7cdceae13d62f25495fa77591b2ea0ab7cd19e /drivers | |
parent | ebb4949eb32ff500602f960525592fc4e614c5a7 (diff) | |
download | lwn-c37a01779b3954d9c8f9ac4f663a03c11f69fded.tar.gz lwn-c37a01779b3954d9c8f9ac4f663a03c11f69fded.zip |
iommu/vt-d: Fix crash on boot when DMAR is disabled
By default CONFIG_INTEL_IOMMU_DEFAULT_ON is not set and thus
dmar_disabled variable is set.
Intel IOMMU driver based on above doesn't set intel_iommu_enabled
variable.
The commit b0119e870837 ("iommu: Introduce new 'struct iommu_device'")
mistakenly assumes it never happens and tries to unregister not ever
registered resources, which crashes the kernel at boot time:
BUG: unable to handle kernel NULL pointer dereference at 0000000000000008
IP: iommu_device_unregister+0x31/0x60
Make unregister procedure conditional in free_iommu().
Fixes: b0119e870837 ("iommu: Introduce new 'struct iommu_device'")
Cc: Joerg Roedel <jroedel@suse.de>
Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Signed-off-by: Joerg Roedel <jroedel@suse.de>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/iommu/dmar.c | 6 |
1 files changed, 4 insertions, 2 deletions
diff --git a/drivers/iommu/dmar.c b/drivers/iommu/dmar.c index d9c0decfc91a..36e3f430d265 100644 --- a/drivers/iommu/dmar.c +++ b/drivers/iommu/dmar.c @@ -1108,8 +1108,10 @@ error: static void free_iommu(struct intel_iommu *iommu) { - iommu_device_sysfs_remove(&iommu->iommu); - iommu_device_unregister(&iommu->iommu); + if (intel_iommu_enabled) { + iommu_device_unregister(&iommu->iommu); + iommu_device_sysfs_remove(&iommu->iommu); + } if (iommu->irq) { if (iommu->pr_irq) { |