lkml.org 
[lkml]   [2015]   [May]   [11]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH kernel v10 04/34] powerpc/iommu: Put IOMMU group explicitly
    Date
    So far an iommu_table lifetime was the same as PE. Dynamic DMA windows
    will change this and iommu_free_table() will not always require
    the group to be released.

    This moves iommu_group_put() out of iommu_free_table().

    This adds a iommu_pseries_free_table() helper which does
    iommu_group_put() and iommu_free_table(). Later it will be
    changed to receive a table_group and we will have to change less
    lines then.

    This should cause no behavioural change.

    Signed-off-by: Alexey Kardashevskiy <aik@ozlabs.ru>
    ---
    arch/powerpc/kernel/iommu.c | 7 -------
    arch/powerpc/platforms/powernv/pci-ioda.c | 5 +++++
    arch/powerpc/platforms/pseries/iommu.c | 14 +++++++++++++-
    3 files changed, 18 insertions(+), 8 deletions(-)

    diff --git a/arch/powerpc/kernel/iommu.c b/arch/powerpc/kernel/iommu.c
    index b054f33..3d47eb3 100644
    --- a/arch/powerpc/kernel/iommu.c
    +++ b/arch/powerpc/kernel/iommu.c
    @@ -726,13 +726,6 @@ void iommu_free_table(struct iommu_table *tbl, const char *node_name)
    if (tbl->it_offset == 0)
    clear_bit(0, tbl->it_map);

    -#ifdef CONFIG_IOMMU_API
    - if (tbl->it_group) {
    - iommu_group_put(tbl->it_group);
    - BUG_ON(tbl->it_group);
    - }
    -#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);
    diff --git a/arch/powerpc/platforms/powernv/pci-ioda.c b/arch/powerpc/platforms/powernv/pci-ioda.c
    index 8ca7abd..8c3c4bf 100644
    --- a/arch/powerpc/platforms/powernv/pci-ioda.c
    +++ b/arch/powerpc/platforms/powernv/pci-ioda.c
    @@ -23,6 +23,7 @@
    #include <linux/io.h>
    #include <linux/msi.h>
    #include <linux/memblock.h>
    +#include <linux/iommu.h>

    #include <asm/sections.h>
    #include <asm/io.h>
    @@ -1310,6 +1311,10 @@ static void pnv_pci_ioda2_release_dma_pe(struct pci_dev *dev, struct pnv_ioda_pe
    if (rc)
    pe_warn(pe, "OPAL error %ld release DMA window\n", rc);

    + if (tbl->it_group) {
    + iommu_group_put(tbl->it_group);
    + BUG_ON(tbl->it_group);
    + }
    iommu_free_table(tbl, of_node_full_name(dev->dev.of_node));
    free_pages(addr, get_order(TCE32_TABLE_SIZE));
    pe->tce32_table = NULL;
    diff --git a/arch/powerpc/platforms/pseries/iommu.c b/arch/powerpc/platforms/pseries/iommu.c
    index 05ab06d..89f557b 100644
    --- a/arch/powerpc/platforms/pseries/iommu.c
    +++ b/arch/powerpc/platforms/pseries/iommu.c
    @@ -36,6 +36,7 @@
    #include <linux/crash_dump.h>
    #include <linux/memory.h>
    #include <linux/of.h>
    +#include <linux/iommu.h>
    #include <asm/io.h>
    #include <asm/prom.h>
    #include <asm/rtas.h>
    @@ -51,6 +52,16 @@

    #include "pseries.h"

    +static void iommu_pseries_free_table(struct iommu_table *tbl,
    + const char *node_name)
    +{
    + if (tbl->it_group) {
    + iommu_group_put(tbl->it_group);
    + BUG_ON(tbl->it_group);
    + }
    + iommu_free_table(tbl, node_name);
    +}
    +
    static void tce_invalidate_pSeries_sw(struct iommu_table *tbl,
    __be64 *startp, __be64 *endp)
    {
    @@ -1271,7 +1282,8 @@ static int iommu_reconfig_notifier(struct notifier_block *nb, unsigned long acti
    */
    remove_ddw(np, false);
    if (pci && pci->iommu_table)
    - iommu_free_table(pci->iommu_table, np->full_name);
    + iommu_pseries_free_table(pci->iommu_table,
    + np->full_name);

    spin_lock(&direct_window_list_lock);
    list_for_each_entry(window, &direct_window_list, list) {
    --
    2.4.0.rc3.8.gfb3e7d5


    \
     
     \ /
      Last update: 2015-05-11 18:21    [W:2.781 / U:0.164 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site