diff options
author | John Garry <john.garry@huawei.com> | 2022-07-14 19:15:24 +0800 |
---|---|---|
committer | Christoph Hellwig <hch@lst.de> | 2022-07-19 06:05:41 +0200 |
commit | a229cc14f3395311b899e5e582b71efa8dd01df0 (patch) | |
tree | c582777858d9da5c8d70cad910a04859b213fd8f /kernel/dma | |
parent | 942a8186eb4451700dadd1d60a2e43ce67605991 (diff) | |
download | linux-stable-a229cc14f3395311b899e5e582b71efa8dd01df0.tar.gz linux-stable-a229cc14f3395311b899e5e582b71efa8dd01df0.tar.bz2 linux-stable-a229cc14f3395311b899e5e582b71efa8dd01df0.zip |
dma-mapping: add dma_opt_mapping_size()
Streaming DMA mapping involving an IOMMU may be much slower for larger
total mapping size. This is because every IOMMU DMA mapping requires an
IOVA to be allocated and freed. IOVA sizes above a certain limit are not
cached, which can have a big impact on DMA mapping performance.
Provide an API for device drivers to know this "optimal" limit, such that
they may try to produce mapping which don't exceed it.
Signed-off-by: John Garry <john.garry@huawei.com>
Reviewed-by: Damien Le Moal <damien.lemoal@opensource.wdc.com>
Acked-by: Martin K. Petersen <martin.petersen@oracle.com>
Signed-off-by: Christoph Hellwig <hch@lst.de>
Diffstat (limited to 'kernel/dma')
-rw-r--r-- | kernel/dma/mapping.c | 12 |
1 files changed, 12 insertions, 0 deletions
diff --git a/kernel/dma/mapping.c b/kernel/dma/mapping.c index db7244291b74..1bfe11b1edb6 100644 --- a/kernel/dma/mapping.c +++ b/kernel/dma/mapping.c @@ -773,6 +773,18 @@ size_t dma_max_mapping_size(struct device *dev) } EXPORT_SYMBOL_GPL(dma_max_mapping_size); +size_t dma_opt_mapping_size(struct device *dev) +{ + const struct dma_map_ops *ops = get_dma_ops(dev); + size_t size = SIZE_MAX; + + if (ops && ops->opt_mapping_size) + size = ops->opt_mapping_size(); + + return min(dma_max_mapping_size(dev), size); +} +EXPORT_SYMBOL_GPL(dma_opt_mapping_size); + bool dma_need_sync(struct device *dev, dma_addr_t dma_addr) { const struct dma_map_ops *ops = get_dma_ops(dev); |