diff options
| author | Qingfang Deng <qingfang.deng@linux.dev> | 2026-09-03 09:29:13 +0800 |
|---|---|---|
| committer | Marek Szyprowski <m.szyprowski@samsung.com> | 2026-09-07 18:55:12 +0200 |
| commit | 641a9b9cc697eb6ea375a25aafc6884d1b485612 (patch) | |
| tree | 48c6690c9f52d1bb22443991d3399c4f67a2acbd /include/linux | |
| parent | 95d2fec40c483d8a63e5ffa0fa88faeb2e0ed462 (diff) | |
| download | linux-next-641a9b9cc697eb6ea375a25aafc6884d1b485612.tar.gz linux-next-641a9b9cc697eb6ea375a25aafc6884d1b485612.zip | |
dma-mapping: use exact allocation for DMA pages
DMA page allocation fallbacks use alloc_pages_node() with get_order(size),
wasting the unused tail for non-power-of-two requests.
Use alloc_pages_exact_nid() and free_pages_exact() so that a buddy
fallback retains only requested pages.
Signed-off-by: Qingfang Deng <qingfang.deng@linux.dev>
Link: https://lore.kernel.org/r/20260903012914.312305-1-qingfang.deng@linux.dev
Signed-off-by: Marek Szyprowski <m.szyprowski@samsung.com>
Diffstat (limited to 'include/linux')
| -rw-r--r-- | include/linux/dma-map-ops.h | 2 | ||||
| -rw-r--r-- | include/linux/gfp.h | 2 |
2 files changed, 2 insertions, 2 deletions
diff --git a/include/linux/dma-map-ops.h b/include/linux/dma-map-ops.h index eee6de5188c7..afaf2c12189b 100644 --- a/include/linux/dma-map-ops.h +++ b/include/linux/dma-map-ops.h @@ -143,7 +143,7 @@ static inline struct page *dma_alloc_contiguous(struct device *dev, size_t size, static inline void dma_free_contiguous(struct device *dev, struct page *page, size_t size) { - __free_pages(page, get_order(size)); + free_pages_exact(page_address(page), size); } #endif /* CONFIG_DMA_CMA*/ diff --git a/include/linux/gfp.h b/include/linux/gfp.h index 872bc53f32ec..aa4601805f21 100644 --- a/include/linux/gfp.h +++ b/include/linux/gfp.h @@ -329,7 +329,7 @@ void *alloc_pages_exact_noprof(size_t size, gfp_t gfp_mask) __alloc_size(1); void free_pages_exact(void *virt, size_t size); -__meminit void *alloc_pages_exact_nid_noprof(int nid, size_t size, gfp_t gfp_mask) __alloc_size(2); +void *alloc_pages_exact_nid_noprof(int nid, size_t size, gfp_t gfp_mask) __alloc_size(2); #define alloc_pages_exact_nid(...) \ alloc_hooks(alloc_pages_exact_nid_noprof(__VA_ARGS__)) |
