lkml.org 
[lkml]   [2018]   [Feb]   [10]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Date
    Subject[PATCH 3.16 011/136] iommu/vt-d: Don't register bus-notifier under dmar_global_lock
    3.16.54-rc1 review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Joerg Roedel <jroedel@suse.de>

    commit ec154bf56b276a0bb36079a5d22a267b5f417801 upstream.

    The notifier function will take the dmar_global_lock too, so
    lockdep complains about inverse locking order when the
    notifier is registered under the dmar_global_lock.

    Reported-by: Jan Kiszka <jan.kiszka@siemens.com>
    Fixes: 59ce0515cdaf ('iommu/vt-d: Update DRHD/RMRR/ATSR device scope caches when PCI hotplug happens')
    Signed-off-by: Joerg Roedel <jroedel@suse.de>
    [bwh: Backported to 3.16: adjust context]
    Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
    ---
    drivers/iommu/dmar.c | 7 +++++--
    drivers/iommu/intel-iommu.c | 10 ++++++++++
    include/linux/dmar.h | 1 +
    3 files changed, 16 insertions(+), 2 deletions(-)

    --- a/drivers/iommu/dmar.c
    +++ b/drivers/iommu/dmar.c
    @@ -718,13 +718,16 @@ int __init dmar_dev_scope_init(void)
    dmar_free_pci_notify_info(info);
    }
    }
    -
    - bus_register_notifier(&pci_bus_type, &dmar_pci_bus_nb);
    }

    return dmar_dev_scope_status;
    }

    +void dmar_register_bus_notifier(void)
    +{
    + bus_register_notifier(&pci_bus_type, &dmar_pci_bus_nb);
    +}
    +

    int __init dmar_table_init(void)
    {
    --- a/drivers/iommu/intel-iommu.c
    +++ b/drivers/iommu/intel-iommu.c
    @@ -4044,6 +4044,16 @@ int __init intel_iommu_init(void)
    goto out_free_dmar;
    }

    + up_write(&dmar_global_lock);
    +
    + /*
    + * The bus notifier takes the dmar_global_lock, so lockdep will
    + * complain later when we register it under the lock.
    + */
    + dmar_register_bus_notifier();
    +
    + down_write(&dmar_global_lock);
    +
    if (no_iommu || dmar_disabled)
    goto out_free_dmar;

    --- a/include/linux/dmar.h
    +++ b/include/linux/dmar.h
    @@ -100,6 +100,7 @@ static inline bool dmar_rcu_check(void)

    extern int dmar_table_init(void);
    extern int dmar_dev_scope_init(void);
    +extern void dmar_register_bus_notifier(void);
    extern int dmar_parse_dev_scope(void *start, void *end, int *cnt,
    struct dmar_dev_scope **devices, u16 segment);
    extern void *dmar_alloc_dev_scope(void *start, void *end, int *cnt);
    \
     
     \ /
      Last update: 2018-02-11 05:59    [W:4.111 / U:0.240 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site