APPLIED/Cmt Re: [PATCH v2 00/60][SRU][OEM-5.6] Fix can't find root device on VMD when secureboot enabled

Timo Aaltonen tjaalton at ubuntu.com
Fri Jun 12 10:21:00 UTC 2020


On 2.6.2020 10.43, You-Sheng Yang wrote:
> BugLink: https://bugs.launchpad.net/bugs/1876707
> 
> [Impact]
> 
> On platforms with NVMe attached to VMD controller, enable SecureBoot
> would also force enable iommu:
> 
>   DMAR: Intel-IOMMU force enabled due to platform opt in
> 
> While devices behind the VMD controller, also a PCI bridge, maybe forced
> to use a DMA domain by current Intel-IOMMU driver, this may break some
> relationships between sub devices behind VMD controller and between the
> VMD controller and its children devices, and finally caused undefined
> system behavior.
> 
> On devices at hand, this results in kernel NULL dereference at
> __intel_map_single called from nvme_reset_work and fails root device
> lookup at boot.
> 
>   kernel: BUG: kernel NULL pointer dereference, address: 0000000000000018
>   kernel: #PF: supervisor read access in kernel mode
>   kernel: #PF: error_code(0x0000) - not-present page
>   kernel: PGD 0 P4D 0
>   kernel: Oops: 0000 [#2] SMP NOPTI
>   kernel: CPU: 1 PID: 254 Comm: kworker/u8:4 Tainted: G D W
>   5.7.0-050700rc3-generic #202004262131
>   kernel: Hardware name: Dell Inc. Vostro 5402/, BIOS 0.1.2 04/13/2020
>   kernel: Workqueue: nvme-reset-wq nvme_reset_work [nvme]
>   kernel: RIP: 0010:__intel_map_single+0xa3/0x1a0
>   ...
> 
> [Fix]
> 
> Patchset[1] currently landed in linux-next beginning with commit
> 327d5b2fee91 ("iommu/vt-d: Allow 32bit devices to uses DMA domain")
> gives the solution to this problem. However, it's based on a massive
> subsystem rewrite in patchset[2] beginning with commit 441ff2ff8327
> ("Move default domain allocation to separate function").
> 
> On v5.6, it also depends on yet a few more patch series landed in
> v5.7-rc1 beginning with commit 098accf2da94 ("iommu: Use C99 flexible
> array in fwspec") that rewrote private data access, changed struct
> names, etc.
> 
> Yet a few additional patches included as fixes to above changes.
> 
> [1]: https://lore.kernel.org/linux-iommu/7928dd48-93da-62f0-b455-6e6b248d0fae@linux.intel.com/
> [2]: https://lore.kernel.org/linux-iommu/20200429133712.31431-1-joro@8bytes.org/
> 
> [Test Case]
> 
> Test on platforms with VMD/NVMe and enable SecureBoot. System should
> boot normally rather than into initramfs emergency shell.
> 
> [Regression Potential]
> For unstable, all the patches are from linux-next and we will probably catch up
> soon, so should be safe to place a LOW here.
> 
> For oem-5.6, the fixing patchset is depending on iommu group setup
> refactoring that touched almost every architecture/platform uses iommu
> although we would only care amd64 among them. Even with follow-up fixes
> included, this is still a 60-patches change and deserves some more
> attention. Medium.
> 
> [Other Info]
> 
> v2: update patch cherry-pick origin info.
> 
> Arnd Bergmann (1):
>   iommu/renesas: Fix unused-function warning
> 
> Joerg Roedel (49):
>   iommu: Define dev_iommu_fwspec_get() for !CONFIG_IOMMU_API
>   ACPI/IORT: Remove direct access of dev->iommu_fwspec
>   drm/msm/mdp5: Remove direct access of dev->iommu_fwspec
>   iommu/tegra-gart: Remove direct access of dev->iommu_fwspec
>   iommu: Rename struct iommu_param to dev_iommu
>   iommu: Move iommu_fwspec to struct dev_iommu
>   iommu/arm-smmu: Fix uninitilized variable warning
>   iommu: Introduce accessors for iommu private data
>   iommu/arm-smmu-v3: Use accessor functions for iommu private data
>   iommu/arm-smmu: Use accessor functions for iommu private data
>   iommu/renesas: Use accessor functions for iommu private data
>   iommu/mediatek: Use accessor functions for iommu private data
>   iommu/qcom: Use accessor functions for iommu private data
>   iommu/virtio: Use accessor functions for iommu private data
>   iommu: Move fwspec->iommu_priv to struct dev_iommu
>   iommu: Move default domain allocation to separate function
>   iommu/amd: Implement iommu_ops->def_domain_type call-back
>   iommu/vt-d: Wire up iommu_ops->def_domain_type
>   iommu/amd: Remove dma_mask check from check_device()
>   iommu/amd: Return -ENODEV in add_device when device is not handled by
>     IOMMU
>   iommu: Add probe_device() and release_device() call-backs
>   iommu: Move default domain allocation to iommu_probe_device()
>   iommu: Keep a list of allocated groups in __iommu_probe_device()
>   iommu: Move new probe_device path to separate function
>   iommu: Split off default domain allocation from group assignment
>   iommu: Move iommu_group_create_direct_mappings() out of
>     iommu_group_add_device()
>   iommu: Export bus_iommu_probe() and make is safe for re-probing
>   iommu/amd: Remove dev_data->passthrough
>   iommu/amd: Convert to probe/release_device() call-backs
>   iommu/vt-d: Convert to probe/release_device() call-backs
>   iommu/arm-smmu: Convert to probe/release_device() call-backs
>   iommu/pamu: Convert to probe/release_device() call-backs
>   iommu/s390: Convert to probe/release_device() call-backs
>   iommu/virtio: Convert to probe/release_device() call-backs
>   iommu/msm: Convert to probe/release_device() call-backs
>   iommu/mediatek: Convert to probe/release_device() call-backs
>   iommu/mediatek-v1 Convert to probe/release_device() call-backs
>   iommu/qcom: Convert to probe/release_device() call-backs
>   iommu/rockchip: Convert to probe/release_device() call-backs
>   iommu/tegra: Convert to probe/release_device() call-backs
>   iommu/renesas: Convert to probe/release_device() call-backs
>   iommu/omap: Remove orphan_dev tracking
>   iommu/omap: Convert to probe/release_device() call-backs
>   iommu/exynos: Use first SYSMMU in controllers list for IOMMU core
>   iommu/exynos: Convert to probe/release_device() call-backs
>   iommu: Remove add_device()/remove_device() code-paths
>   iommu: Move more initialization to __iommu_probe_device()
>   iommu: Unexport iommu_group_get_for_dev()
>   iommu: Don't call .probe_finalize() under group->mutex
> 
> Kevin Hao (1):
>   iommu: Fix the memory leak in dev_iommu_free()
> 
> Lu Baolu (3):
>   iommu/vt-d: Allow 32bit devices to uses DMA domain
>   iommu/vt-d: Allow PCI sub-hierarchy to use DMA domain
>   iommu/vt-d: Apply per-device dma_ops
> 
> Qian Cai (1):
>   iommu/amd: Fix variable "iommu" set but not used
> 
> Robin Murphy (2):
>   iommu: Use C99 flexible array in fwspec
>   iommu/arm-smmu: Refactor master_cfg/fwspec usage
> 
> Sai Praneeth Prakhya (2):
>   iommu: Add def_domain_type() callback in iommu_ops
>   iommu: Remove functions that support private domain
> 
> Tero Kristo via iommu (1):
>   iommu/omap: Add check for iommu group when no IOMMU in use
> 
>  drivers/acpi/arm64/iort.c                |   6 +-
>  drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.c |   2 +-
>  drivers/iommu/amd_iommu.c                | 100 ++---
>  drivers/iommu/amd_iommu_types.h          |   1 -
>  drivers/iommu/arm-smmu-v3.c              |  46 +--
>  drivers/iommu/arm-smmu.c                 |  92 ++---
>  drivers/iommu/exynos-iommu.c             |  24 +-
>  drivers/iommu/fsl_pamu_domain.c          |  22 +-
>  drivers/iommu/intel-iommu.c              | 460 ++-------------------
>  drivers/iommu/iommu.c                    | 501 ++++++++++++++++-------
>  drivers/iommu/ipmmu-vmsa.c               |  66 +--
>  drivers/iommu/msm_iommu.c                |  34 +-
>  drivers/iommu/mtk_iommu.c                |  35 +-
>  drivers/iommu/mtk_iommu_v1.c             |  62 ++-
>  drivers/iommu/omap-iommu.c               | 102 +----
>  drivers/iommu/qcom_iommu.c               |  85 ++--
>  drivers/iommu/rockchip-iommu.c           |  26 +-
>  drivers/iommu/s390-iommu.c               |  22 +-
>  drivers/iommu/tegra-gart.c               |  26 +-
>  drivers/iommu/tegra-smmu.c               |  31 +-
>  drivers/iommu/virtio-iommu.c             |  52 +--
>  include/linux/device.h                   |   9 +-
>  include/linux/iommu.h                    |  68 +--
>  23 files changed, 710 insertions(+), 1162 deletions(-)
> 

oh well, it's all from 5.8~ and I guess we'll spot regressions pretty
quickly, so applied to oem-5.6-next..


-- 
t



More information about the kernel-team mailing list