riscv: mm: still create swiotlb buffer for kmalloc() bouncing if required
PATCH v3 1/1 riscv: mm: still create swiotlb buffer for kmalloc() bouncing if required
After commit f51f7a0fc2f4 ("riscv: enable DMA_BOUNCE_UNALIGNED_KMALLOC for !dma_coherent"), for non-coherent platforms with less than 4GB memory, we rely on users to pass "swiotlb=mmnn,force" kernel parameters to enable DMA bouncing for unaligned kmalloc() buffers. Now let's go
further: If no bouncing needed for ZONE_DMA, let kernel automatically allocate 1MB swiotlb buffer per 1GB of RAM for kmalloc() bouncing on non-coherent platforms, so that no need to pass "swiotlb=mmnn,force" any more.
The math of "1MB swiotlb buffer per 1GB of RAM for kmalloc() bouncing" is taken from arm64. Users can still force smaller swiotlb buffer by passing "swiotlb=mmnn".
---
since v2:
- rebase on v6.8-rc1
- collect Reviewed-by tag
since v1
- fix build error if CONFIG_RISCV_DMA_NONCOHERENT=n
arch/riscv/include/asm/cache.h | 2 +- arch/riscv/mm/init.c | 16 +++++++++++++++- 2 files changed, 16 insertions(+), 2 deletions(-)
arch/riscv/include/asm/cache.h +1 -1
@@ -26,8 +26,8 @@ #ifndef __ASSEMBLY__ -#ifdef CONFIG_RISCV_DMA_NONCOHERENT extern int dma_cache_alignment; +#ifdef CONFIG_RISCV_DMA_NONCOHERENT #define dma_get_cache_alignment dma_get_cache_alignment static inline int dma_get_cache_alignment(void) {
arch/riscv/mm/init.c +15 -1
@@ -162,11 +162,25 @@ static void print_vm_layout(void) { }void __init mem_init (void ) { +bool swiotlb = max_pfn >PFN_DOWN (dma32_phys_limit);#ifdef CONFIG_FLATMEM BUG_ON (!mem_map);#endif /* CONFIG_FLATMEM */ -swiotlb_init (max_pfn >PFN_DOWN (dma32_phys_limit),SWIOTLB_VERBOSE ); +if (IS_ENABLED (CONFIG_DMA_BOUNCE_UNALIGNED_KMALLOC ) && !swiotlb && + dma_cache_alignment !=1 ) { +/* +* If no bouncing needed for ZONE_DMA, allocate 1MB swiotlb +* buffer per 1GB of RAM for kmalloc() bouncing on +* non-coherent platforms. +*/ +unsigned long size = +DIV_ROUND_UP (memblock_phys_mem_size (),1024 ); +swiotlb_adjust_size (min (swiotlb_size_or_default (), size)); + swiotlb = true; + } + +swiotlb_init (swiotlb,SWIOTLB_VERBOSE );memblock_free_all ();print_vm_layout ();
Signature · 1 line
2.43.0