lkml.org 
[lkml]   [2022]   [May]   [27]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 08/12] iommu/vt-d: Replace spin_lock_irqsave() with spin_lock()
    Date
    The iommu->lock is used to protect changes in root/context/pasid tables
    and domain ID allocation. There's no use case to change these resources
    in any interrupt context. Hence there's no need to disable interrupts
    when helding the spinlock.

    Signed-off-by: Lu Baolu <baolu.lu@linux.intel.com>
    ---
    drivers/iommu/intel/debugfs.c | 6 ++----
    drivers/iommu/intel/iommu.c | 17 +++++++----------
    2 files changed, 9 insertions(+), 14 deletions(-)

    diff --git a/drivers/iommu/intel/debugfs.c b/drivers/iommu/intel/debugfs.c
    index eea8727aa7bc..ca1adceeba19 100644
    --- a/drivers/iommu/intel/debugfs.c
    +++ b/drivers/iommu/intel/debugfs.c
    @@ -263,10 +263,9 @@ static void ctx_tbl_walk(struct seq_file *m, struct intel_iommu *iommu, u16 bus)

    static void root_tbl_walk(struct seq_file *m, struct intel_iommu *iommu)
    {
    - unsigned long flags;
    u16 bus;

    - spin_lock_irqsave(&iommu->lock, flags);
    + spin_lock(&iommu->lock);
    seq_printf(m, "IOMMU %s: Root Table Address: 0x%llx\n", iommu->name,
    (u64)virt_to_phys(iommu->root_entry));
    seq_puts(m, "B.D.F\tRoot_entry\t\t\t\tContext_entry\t\t\t\tPASID\tPASID_table_entry\n");
    @@ -278,8 +277,7 @@ static void root_tbl_walk(struct seq_file *m, struct intel_iommu *iommu)
    */
    for (bus = 0; bus < 256; bus++)
    ctx_tbl_walk(m, iommu, bus);
    -
    - spin_unlock_irqrestore(&iommu->lock, flags);
    + spin_unlock(&iommu->lock);
    }

    static int dmar_translation_struct_show(struct seq_file *m, void *unused)
    diff --git a/drivers/iommu/intel/iommu.c b/drivers/iommu/intel/iommu.c
    index ccf3c7fa26f1..2e195a639502 100644
    --- a/drivers/iommu/intel/iommu.c
    +++ b/drivers/iommu/intel/iommu.c
    @@ -797,13 +797,12 @@ static int device_context_mapped(struct intel_iommu *iommu, u8 bus, u8 devfn)
    {
    struct context_entry *context;
    int ret = 0;
    - unsigned long flags;

    - spin_lock_irqsave(&iommu->lock, flags);
    + spin_lock(&iommu->lock);
    context = iommu_context_addr(iommu, bus, devfn, 0);
    if (context)
    ret = context_present(context);
    - spin_unlock_irqrestore(&iommu->lock, flags);
    + spin_unlock(&iommu->lock);
    return ret;
    }

    @@ -2287,16 +2286,15 @@ static void domain_context_clear_one(struct device_domain_info *info, u8 bus, u8
    {
    struct intel_iommu *iommu = info->iommu;
    struct context_entry *context;
    - unsigned long flags;
    u16 did_old;

    if (!iommu)
    return;

    - spin_lock_irqsave(&iommu->lock, flags);
    + spin_lock(&iommu->lock);
    context = iommu_context_addr(iommu, bus, devfn, 0);
    if (!context) {
    - spin_unlock_irqrestore(&iommu->lock, flags);
    + spin_unlock(&iommu->lock);
    return;
    }

    @@ -2311,7 +2309,7 @@ static void domain_context_clear_one(struct device_domain_info *info, u8 bus, u8

    context_clear_entry(context);
    __iommu_flush_cache(iommu, context, sizeof(*context));
    - spin_unlock_irqrestore(&iommu->lock, flags);
    + spin_unlock(&iommu->lock);
    iommu->flush.flush_context(iommu,
    did_old,
    (((u16)bus) << 8) | devfn,
    @@ -2764,7 +2762,6 @@ static int copy_translation_tables(struct intel_iommu *iommu)
    struct root_entry *old_rt;
    phys_addr_t old_rt_phys;
    int ctxt_table_entries;
    - unsigned long flags;
    u64 rtaddr_reg;
    int bus, ret;
    bool new_ext, ext;
    @@ -2807,7 +2804,7 @@ static int copy_translation_tables(struct intel_iommu *iommu)
    }
    }

    - spin_lock_irqsave(&iommu->lock, flags);
    + spin_lock(&iommu->lock);

    /* Context tables are copied, now write them to the root_entry table */
    for (bus = 0; bus < 256; bus++) {
    @@ -2826,7 +2823,7 @@ static int copy_translation_tables(struct intel_iommu *iommu)
    iommu->root_entry[bus].hi = val;
    }

    - spin_unlock_irqrestore(&iommu->lock, flags);
    + spin_unlock(&iommu->lock);

    kfree(ctxt_tbls);

    --
    2.25.1
    \
     
     \ /
      Last update: 2022-05-27 08:35    [W:3.057 / U:0.336 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site