[RFC PATCH v2 03/10] dma: contiguous: Add API to check if an allocation is from CMA
Samiullah Khawaja <[email protected]>
| Newsgroups | org.infradead.lists.kexec,dev.linux.lists.iommu,org.kernel.vger.linux-kernel,org.kvack.linux-mm |
|---|---|
| Message-ID | <[email protected]> |
Add an API that uses cma_for_each() to check whether a DMA allocation is from a CMA region. Signed-off-by: Samiullah Khawaja <[email protected]> --- include/linux/dma-map-ops.h | 6 ++++++ kernel/dma/contiguous.c | 24 ++++++++++++++++++++++++ 2 files changed, 30 insertions(+) diff --git a/include/linux/dma-map-ops.h b/include/linux/dma-map-ops.h index 9382785a2faa..9b91c839ceb5 100644 --- a/include/linux/dma-map-ops.h +++ b/include/linux/dma-map-ops.h @@ -106,6 +106,7 @@ struct page *dma_alloc_contiguous(struct device *dev, size_t size, gfp_t gfp); void dma_free_contiguous(struct device *dev, struct page *page, size_t size); void dma_contiguous_early_fixup(phys_addr_t base, unsigned long size); +bool dma_is_from_cma(phys_addr_t phys, size_t size); #else /* CONFIG_DMA_CMA */ static inline struct cma *dev_get_cma_area(struct device *dev) { @@ -145,6 +146,11 @@ static inline void dma_free_contiguous(struct device *dev, struct page *page, { __free_pages(page, get_order(size)); } + +static inline bool dma_is_from_cma(phys_addr_t phys, size_t size) +{ + return false; +} #endif /* CONFIG_DMA_CMA*/ #ifdef CONFIG_DMA_DECLARE_COHERENT diff --git a/kernel/dma/contiguous.c b/kernel/dma/contiguous.c index 03f52bd17120..0b1702bf39ca 100644 --- a/kernel/dma/contiguous.c +++ b/kernel/dma/contiguous.c @@ -130,6 +130,30 @@ struct cma *dev_get_cma_area(struct device *dev) } EXPORT_SYMBOL_GPL(dev_get_cma_area); +struct dma_cma_check_data { + phys_addr_t start; + phys_addr_t end; +}; + +static int dma_cma_check_area(struct cma *cma, void *data) +{ + struct dma_cma_check_data *chk = data; + + if (cma_intersects(cma, chk->start, chk->end)) + return 1; + return 0; +} + +bool dma_is_from_cma(phys_addr_t phys, size_t size) +{ + struct dma_cma_check_data chk = { + .start = phys, + .end = phys + size - 1, + }; + + return cma_for_each_area(dma_cma_check_area, &chk) != 0; +} + #ifdef CONFIG_DMA_NUMA_CMA static struct cma *dma_contiguous_numa_area[MAX_NUMNODES]; -- 2.55.0.795.g602f6c329a-goog