[PATCH] arm64: mm: reduce swiotlb size when dynamic swiotlb enabled
Kefeng Wang
wangkefeng.wang at huawei.com
Sat May 11 00:45:44 PDT 2024
On 2024/5/10 19:42, Will Deacon wrote:
> [+Isaac]
>
> On Wed, May 08, 2024 at 09:23:00PM +0800, Kefeng Wang wrote:
>> After commit a1e50a82256e ("arm64: Increase the swiotlb buffer size
>> 64MB"), the swiotlb buffer size increased to 64M in case of 32-bit only
>> devices require many bounce buffering via swiotlb, but with the
>> CONFIG_SWIOTLB_DYNAMIC enabled, we could reduce swiotlb size from 64M to
>> 4M(MAX_ORDER_NR_PAGES << PAGE_SHIFT) again since swiotlb buffer size could
>> be allocated danamicly, and this should save 60M for most platform which
>> don't require too much swiotlb buffer.
>>
>> Signed-off-by: Kefeng Wang <wangkefeng.wang at huawei.com>
>> ---
>> arch/arm64/mm/init.c | 11 ++++++++---
>> 1 file changed, 8 insertions(+), 3 deletions(-)
>>
>> diff --git a/arch/arm64/mm/init.c b/arch/arm64/mm/init.c
>> index 9b5ab6818f7f..425222c13d97 100644
>> --- a/arch/arm64/mm/init.c
>> +++ b/arch/arm64/mm/init.c
>> @@ -370,18 +370,23 @@ void __init bootmem_init(void)
>> void __init mem_init(void)
>> {
>> bool swiotlb = max_pfn > PFN_DOWN(arm64_dma_phys_limit);
>> + unsigned long size = 0;
>>
>> if (IS_ENABLED(CONFIG_DMA_BOUNCE_UNALIGNED_KMALLOC) && !swiotlb) {
>> /*
>> * If no bouncing needed for ZONE_DMA, reduce the swiotlb
>> * buffer for kmalloc() bouncing to 1MB per 1GB of RAM.
>> */
>> - unsigned long size =
>> - DIV_ROUND_UP(memblock_phys_mem_size(), 1024);
>> - swiotlb_adjust_size(min(swiotlb_size_or_default(), size));
>> + size = DIV_ROUND_UP(memblock_phys_mem_size(), 1024);
>> swiotlb = true;
>> }
>>
>> + if (IS_ENABLED(CONFIG_SWIOTLB_DYNAMIC) && !size)
>> + size = MAX_ORDER_NR_PAGES << PAGE_SHIFT;
>> +
>> + if (size)
>> + swiotlb_adjust_size(min(swiotlb_size_or_default(), size));
>
> If 64MiB is deemed too much, can't you just provide an alternative size
> on the kernel cmdline (swiotlb=) instead of adding more heuristics here?
This is not very suitable for distribution.
>
> Otherwise, if you really want to change the default, then I think
> swiotlb_size_or_default() is the place to do it, not in the arch code.
I don't know the size used by swiotlb in other archs, and the switlb
can't grow if rmap not null even CONFIG_SWIOTLB_DYNAMIC enabled, eg,
pci_xen_swiotlb_init() on x86.
On arm64, the default size is 4MiB from 3.15 to 4.0(until the a1e50a822,
I reported a 32-bit only sata device which uses lots of swiotlb, and no
other reports same issue), and now I think most of platform are 64bit
device, so with SWIOTLB_DYNAMIC, change it back to 4MiB is feasible on
arm64, and the size is adjusted according to
CONFIG_DMA_BOUNCE_UNALIGNED_KMALLOC, so add a new adjust only arm64 changed.
Thanks.
More information about the linux-arm-kernel
mailing list