lkml.org 
[lkml]   [2021]   [Jun]   [15]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v6 01/15] iommu/io-pgtable: Introduce unmap_pages() as a page table op
    Date
    From: "Isaac J. Manjarres" <isaacm@codeaurora.org>

    The io-pgtable code expects to operate on a single block or
    granule of memory that is supported by the IOMMU hardware when
    unmapping memory.

    This means that when a large buffer that consists of multiple
    such blocks is unmapped, the io-pgtable code will walk the page
    tables to the correct level to unmap each block, even for blocks
    that are virtually contiguous and at the same level, which can
    incur an overhead in performance.

    Introduce the unmap_pages() page table op to express to the
    io-pgtable code that it should unmap a number of blocks of
    the same size, instead of a single block. Doing so allows
    multiple blocks to be unmapped in one call to the io-pgtable
    code, reducing the number of page table walks, and indirect
    calls.

    Signed-off-by: Isaac J. Manjarres <isaacm@codeaurora.org>
    Suggested-by: Will Deacon <will@kernel.org>
    Signed-off-by: Will Deacon <will@kernel.org>
    Signed-off-by: Georgi Djakov <quic_c_gdjako@quicinc.com>
    ---
    include/linux/io-pgtable.h | 4 ++++
    1 file changed, 4 insertions(+)

    diff --git a/include/linux/io-pgtable.h b/include/linux/io-pgtable.h
    index 4d40dfa75b55..9391c5fa71e6 100644
    --- a/include/linux/io-pgtable.h
    +++ b/include/linux/io-pgtable.h
    @@ -144,6 +144,7 @@ struct io_pgtable_cfg {
    *
    * @map: Map a physically contiguous memory region.
    * @unmap: Unmap a physically contiguous memory region.
    + * @unmap_pages: Unmap a range of virtually contiguous pages of the same size.
    * @iova_to_phys: Translate iova to physical address.
    *
    * These functions map directly onto the iommu_ops member functions with
    @@ -154,6 +155,9 @@ struct io_pgtable_ops {
    phys_addr_t paddr, size_t size, int prot, gfp_t gfp);
    size_t (*unmap)(struct io_pgtable_ops *ops, unsigned long iova,
    size_t size, struct iommu_iotlb_gather *gather);
    + size_t (*unmap_pages)(struct io_pgtable_ops *ops, unsigned long iova,
    + size_t pgsize, size_t pgcount,
    + struct iommu_iotlb_gather *gather);
    phys_addr_t (*iova_to_phys)(struct io_pgtable_ops *ops,
    unsigned long iova);
    };
    \
     
     \ /
      Last update: 2021-06-15 19:09    [W:4.048 / U:1.136 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site