lkml.org 
[lkml]   [2021]   [Jun]   [24]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v15 06/12] swiotlb: Use is_swiotlb_force_bounce for swiotlb data bouncing
    Date
    Propagate the swiotlb_force into io_tlb_default_mem->force_bounce and
    use it to determine whether to bounce the data or not. This will be
    useful later to allow for different pools.

    Signed-off-by: Claire Chang <tientzu@chromium.org>
    Reviewed-by: Christoph Hellwig <hch@lst.de>
    Tested-by: Stefano Stabellini <sstabellini@kernel.org>
    Tested-by: Will Deacon <will@kernel.org>
    Acked-by: Stefano Stabellini <sstabellini@kernel.org>
    ---
    drivers/xen/swiotlb-xen.c | 2 +-
    include/linux/swiotlb.h | 13 +++++++++++++
    kernel/dma/direct.c | 2 +-
    kernel/dma/direct.h | 2 +-
    kernel/dma/swiotlb.c | 4 ++++
    5 files changed, 20 insertions(+), 3 deletions(-)

    diff --git a/drivers/xen/swiotlb-xen.c b/drivers/xen/swiotlb-xen.c
    index 0c6ed09f8513..4730a146fa35 100644
    --- a/drivers/xen/swiotlb-xen.c
    +++ b/drivers/xen/swiotlb-xen.c
    @@ -369,7 +369,7 @@ static dma_addr_t xen_swiotlb_map_page(struct device *dev, struct page *page,
    if (dma_capable(dev, dev_addr, size, true) &&
    !range_straddles_page_boundary(phys, size) &&
    !xen_arch_need_swiotlb(dev, phys, dev_addr) &&
    - swiotlb_force != SWIOTLB_FORCE)
    + !is_swiotlb_force_bounce(dev))
    goto done;

    /*
    diff --git a/include/linux/swiotlb.h b/include/linux/swiotlb.h
    index dd1c30a83058..da348671b0d5 100644
    --- a/include/linux/swiotlb.h
    +++ b/include/linux/swiotlb.h
    @@ -84,6 +84,7 @@ extern enum swiotlb_force swiotlb_force;
    * unmap calls.
    * @debugfs: The dentry to debugfs.
    * @late_alloc: %true if allocated using the page allocator
    + * @force_bounce: %true if swiotlb bouncing is forced
    */
    struct io_tlb_mem {
    phys_addr_t start;
    @@ -94,6 +95,7 @@ struct io_tlb_mem {
    spinlock_t lock;
    struct dentry *debugfs;
    bool late_alloc;
    + bool force_bounce;
    struct io_tlb_slot {
    phys_addr_t orig_addr;
    size_t alloc_size;
    @@ -109,6 +111,13 @@ static inline bool is_swiotlb_buffer(struct device *dev, phys_addr_t paddr)
    return mem && paddr >= mem->start && paddr < mem->end;
    }

    +static inline bool is_swiotlb_force_bounce(struct device *dev)
    +{
    + struct io_tlb_mem *mem = dev->dma_io_tlb_mem;
    +
    + return mem && mem->force_bounce;
    +}
    +
    void __init swiotlb_exit(void);
    unsigned int swiotlb_max_segment(void);
    size_t swiotlb_max_mapping_size(struct device *dev);
    @@ -120,6 +129,10 @@ static inline bool is_swiotlb_buffer(struct device *dev, phys_addr_t paddr)
    {
    return false;
    }
    +static inline bool is_swiotlb_force_bounce(struct device *dev)
    +{
    + return false;
    +}
    static inline void swiotlb_exit(void)
    {
    }
    diff --git a/kernel/dma/direct.c b/kernel/dma/direct.c
    index 7a88c34d0867..a92465b4eb12 100644
    --- a/kernel/dma/direct.c
    +++ b/kernel/dma/direct.c
    @@ -496,7 +496,7 @@ size_t dma_direct_max_mapping_size(struct device *dev)
    {
    /* If SWIOTLB is active, use its maximum mapping size */
    if (is_swiotlb_active(dev) &&
    - (dma_addressing_limited(dev) || swiotlb_force == SWIOTLB_FORCE))
    + (dma_addressing_limited(dev) || is_swiotlb_force_bounce(dev)))
    return swiotlb_max_mapping_size(dev);
    return SIZE_MAX;
    }
    diff --git a/kernel/dma/direct.h b/kernel/dma/direct.h
    index 13e9e7158d94..4632b0f4f72e 100644
    --- a/kernel/dma/direct.h
    +++ b/kernel/dma/direct.h
    @@ -87,7 +87,7 @@ static inline dma_addr_t dma_direct_map_page(struct device *dev,
    phys_addr_t phys = page_to_phys(page) + offset;
    dma_addr_t dma_addr = phys_to_dma(dev, phys);

    - if (unlikely(swiotlb_force == SWIOTLB_FORCE))
    + if (is_swiotlb_force_bounce(dev))
    return swiotlb_map(dev, phys, size, dir, attrs);

    if (unlikely(!dma_capable(dev, dma_addr, size, true))) {
    diff --git a/kernel/dma/swiotlb.c b/kernel/dma/swiotlb.c
    index 8a120f42340b..0d294bbf274c 100644
    --- a/kernel/dma/swiotlb.c
    +++ b/kernel/dma/swiotlb.c
    @@ -179,6 +179,10 @@ static void swiotlb_init_io_tlb_mem(struct io_tlb_mem *mem, phys_addr_t start,
    mem->end = mem->start + bytes;
    mem->index = 0;
    mem->late_alloc = late_alloc;
    +
    + if (swiotlb_force == SWIOTLB_FORCE)
    + mem->force_bounce = true;
    +
    spin_lock_init(&mem->lock);
    for (i = 0; i < mem->nslabs; i++) {
    mem->slots[i].list = IO_TLB_SEGSIZE - io_tlb_offset(i);
    --
    2.32.0.288.g62a8d224e6-goog
    \
     
     \ /
      Last update: 2021-06-24 17:58    [W:18.993 / U:0.024 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site