RE: [PATCH] dma-remap: Use kvmalloc_array/kvfree for larger dma memory remap

From: gaoxu
Date: Mon May 15 2023 - 03:18:16 EST


Please help to review, thanks.

-----Original Message-----
From: gaoxu 00016977
Sent: 2023年5月6日 15:34
To: 'hch@xxxxxx' <hch@xxxxxx>; 'm.szyprowski@xxxxxxxxxxx' <m.szyprowski@xxxxxxxxxxx>
Cc: 'robin.murphy@xxxxxxx' <robin.murphy@xxxxxxx>; 'iommu@xxxxxxxxxxxxxxx' <iommu@xxxxxxxxxxxxxxx>; 'linux-kernel@xxxxxxxxxxxxxxx' <linux-kernel@xxxxxxxxxxxxxxx>; 'surenb@xxxxxxxxxx' <surenb@xxxxxxxxxx>; yipengxiang 00013268 <yipengxiang@xxxxxxxxxxx>; wangbintian 00013160 <bintian.wang@xxxxxxxxxxx>; hanfeng 00012985 <feng.han@xxxxxxxxxxx>
Subject: [PATCH] dma-remap: Use kvmalloc_array/kvfree for larger dma memory remap

If dma_direct_alloc() alloc memory in size of 64MB, the inner function
dma_common_contiguous_remap() will allocate 128KB memory by invoking the function kmalloc_array(). and the kmalloc_array seems to fail to try to allocate 128KB mem. work around by doing kvmalloc_array instead.

Signed-off-by: Gao Xu <gaoxu2@xxxxxxxxxxx>
---
kernel/dma/remap.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/kernel/dma/remap.c b/kernel/dma/remap.c index b45266680..27596f3b4 100644
--- a/kernel/dma/remap.c
+++ b/kernel/dma/remap.c
@@ -43,13 +43,13 @@ void *dma_common_contiguous_remap(struct page *page, size_t size,
void *vaddr;
int i;

- pages = kmalloc_array(count, sizeof(struct page *), GFP_KERNEL);
+ pages = kvmalloc_array(count, sizeof(struct page *), GFP_KERNEL);
if (!pages)
return NULL;
for (i = 0; i < count; i++)
pages[i] = nth_page(page, i);
vaddr = vmap(pages, count, VM_DMA_COHERENT, prot);
- kfree(pages);
+ kvfree(pages);

return vaddr;
}
--
2.17.1