lkml.org 
[lkml]   [2015]   [Mar]   [13]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH kernel v6 22/29] powerpc/iommu: Split iommu_free_table into 2 helpers
    Date
    The iommu_free_table helper release memory it is using (the TCE table and
    @it_map) and release the iommu_table struct as well. We might not want
    the very last step as we store iommu_table in parent structures.

    Signed-off-by: Alexey Kardashevskiy <aik@ozlabs.ru>
    ---
    arch/powerpc/include/asm/iommu.h | 1 +
    arch/powerpc/kernel/iommu.c | 57 ++++++++++++++++++++++++----------------
    2 files changed, 35 insertions(+), 23 deletions(-)

    diff --git a/arch/powerpc/include/asm/iommu.h b/arch/powerpc/include/asm/iommu.h
    index 6af22a4..fd118ea 100644
    --- a/arch/powerpc/include/asm/iommu.h
    +++ b/arch/powerpc/include/asm/iommu.h
    @@ -125,6 +125,7 @@ static inline void *get_iommu_table_base(struct device *dev)

    extern struct iommu_table *iommu_table_alloc(int node);
    /* Frees table for an individual device node */
    +extern void iommu_reset_table(struct iommu_table *tbl, const char *node_name);
    extern void iommu_free_table(struct iommu_table *tbl, const char *node_name);

    /* Initializes an iommu_table based in values set in the passed-in
    diff --git a/arch/powerpc/kernel/iommu.c b/arch/powerpc/kernel/iommu.c
    index 2856a4a..3500bd0 100644
    --- a/arch/powerpc/kernel/iommu.c
    +++ b/arch/powerpc/kernel/iommu.c
    @@ -721,24 +721,46 @@ struct iommu_table *iommu_table_alloc(int node)
    return &table_group->tables[0];
    }

    +void iommu_reset_table(struct iommu_table *tbl, const char *node_name)
    +{
    + if (!tbl)
    + return;
    +
    + if (tbl->it_map) {
    + unsigned long bitmap_sz;
    + unsigned int order;
    +
    + /*
    + * In case we have reserved the first bit, we should not emit
    + * the warning below.
    + */
    + if (tbl->it_offset == 0)
    + clear_bit(0, tbl->it_map);
    +
    + /* verify that table contains no entries */
    + if (!bitmap_empty(tbl->it_map, tbl->it_size))
    + pr_warn("%s: Unexpected TCEs for %s\n", __func__,
    + node_name);
    +
    + /* calculate bitmap size in bytes */
    + bitmap_sz = BITS_TO_LONGS(tbl->it_size) * sizeof(unsigned long);
    +
    + /* free bitmap */
    + order = get_order(bitmap_sz);
    + free_pages((unsigned long) tbl->it_map, order);
    + }
    +
    + memset(tbl, 0, sizeof(*tbl));
    +}
    +
    void iommu_free_table(struct iommu_table *tbl, const char *node_name)
    {
    - unsigned long bitmap_sz;
    - unsigned int order;
    struct iommu_table_group *table_group = tbl->it_group;

    - if (!tbl || !tbl->it_map) {
    - printk(KERN_ERR "%s: expected TCE map for %s\n", __func__,
    - node_name);
    + if (!tbl)
    return;
    - }

    - /*
    - * In case we have reserved the first bit, we should not emit
    - * the warning below.
    - */
    - if (tbl->it_offset == 0)
    - clear_bit(0, tbl->it_map);
    + iommu_reset_table(tbl, node_name);

    #ifdef CONFIG_IOMMU_API
    if (table_group->group) {
    @@ -747,17 +769,6 @@ void iommu_free_table(struct iommu_table *tbl, const char *node_name)
    }
    #endif

    - /* verify that table contains no entries */
    - if (!bitmap_empty(tbl->it_map, tbl->it_size))
    - pr_warn("%s: Unexpected TCEs for %s\n", __func__, node_name);
    -
    - /* calculate bitmap size in bytes */
    - bitmap_sz = BITS_TO_LONGS(tbl->it_size) * sizeof(unsigned long);
    -
    - /* free bitmap */
    - order = get_order(bitmap_sz);
    - free_pages((unsigned long) tbl->it_map, order);
    -
    /* free table */
    kfree(table_group);
    }
    --
    2.0.0


    \
     
     \ /
      Last update: 2015-03-13 09:41    [W:4.172 / U:0.192 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site