lkml.org 
[lkml]   [2020]   [Mar]   [17]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.4 106/123] iommu/vt-d: Fix RCU-list bugs in intel_iommu_init()
    Date
    From: Qian Cai <cai@lca.pw>

    commit 2d48ea0efb8887ebba3e3720bb5b738aced4e574 upstream.

    There are several places traverse RCU-list without holding any lock in
    intel_iommu_init(). Fix them by acquiring dmar_global_lock.

    WARNING: suspicious RCU usage
    -----------------------------
    drivers/iommu/intel-iommu.c:5216 RCU-list traversed in non-reader section!!

    other info that might help us debug this:

    rcu_scheduler_active = 2, debug_locks = 1
    no locks held by swapper/0/1.

    Call Trace:
    dump_stack+0xa0/0xea
    lockdep_rcu_suspicious+0x102/0x10b
    intel_iommu_init+0x947/0xb13
    pci_iommu_init+0x26/0x62
    do_one_initcall+0xfe/0x500
    kernel_init_freeable+0x45a/0x4f8
    kernel_init+0x11/0x139
    ret_from_fork+0x3a/0x50
    DMAR: Intel(R) Virtualization Technology for Directed I/O

    Fixes: d8190dc63886 ("iommu/vt-d: Enable DMA remapping after rmrr mapped")
    Signed-off-by: Qian Cai <cai@lca.pw>
    Acked-by: Lu Baolu <baolu.lu@linux.intel.com>
    Signed-off-by: Joerg Roedel <jroedel@suse.de>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    ---
    drivers/iommu/intel-iommu.c | 5 ++++-
    1 file changed, 4 insertions(+), 1 deletion(-)

    --- a/drivers/iommu/intel-iommu.c
    +++ b/drivers/iommu/intel-iommu.c
    @@ -5024,6 +5024,7 @@ int __init intel_iommu_init(void)

    init_iommu_pm_ops();

    + down_read(&dmar_global_lock);
    for_each_active_iommu(iommu, drhd) {
    iommu_device_sysfs_add(&iommu->iommu, NULL,
    intel_iommu_groups,
    @@ -5031,6 +5032,7 @@ int __init intel_iommu_init(void)
    iommu_device_set_ops(&iommu->iommu, &intel_iommu_ops);
    iommu_device_register(&iommu->iommu);
    }
    + up_read(&dmar_global_lock);

    bus_set_iommu(&pci_bus_type, &intel_iommu_ops);
    if (si_domain && !hw_pass_through)
    @@ -5041,7 +5043,6 @@ int __init intel_iommu_init(void)
    down_read(&dmar_global_lock);
    if (probe_acpi_namespace_devices())
    pr_warn("ACPI name space devices didn't probe correctly\n");
    - up_read(&dmar_global_lock);

    /* Finally, we enable the DMA remapping hardware. */
    for_each_iommu(iommu, drhd) {
    @@ -5050,6 +5051,8 @@ int __init intel_iommu_init(void)

    iommu_disable_protect_mem_regions(iommu);
    }
    + up_read(&dmar_global_lock);
    +
    pr_info("Intel(R) Virtualization Technology for Directed I/O\n");

    intel_iommu_enabled = 1;

    \
     
     \ /
      Last update: 2020-03-17 12:05    [W:4.894 / U:0.008 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site