Skip to content

Commit 51ff97d

Browse files
gaoxuChristoph Hellwig
authored andcommitted
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. Call trace: [14977.928623] qcrosvm: page allocation failure: order:5, mode:0x40cc0 [14977.928638] dump_backtrace.cfi_jt+0x0/0x8 [14977.928647] dump_stack_lvl+0x80/0xb8 [14977.928652] warn_alloc+0x164/0x200 [14977.928657] __alloc_pages_slowpath+0x9f0/0xb4c [14977.928660] __alloc_pages+0x21c/0x39c [14977.928662] kmalloc_order+0x48/0x108 [14977.928666] kmalloc_order_trace+0x34/0x154 [14977.928668] __kmalloc+0x548/0x7e4 [14977.928673] dma_direct_alloc+0x11c/0x4f8 [14977.928678] dma_alloc_attrs+0xf4/0x138 [14977.928680] gh_vm_ioctl_set_fw_name+0x3c4/0x610 [gunyah] [14977.928698] gh_vm_ioctl+0x90/0x14c [gunyah] [14977.928705] __arm64_sys_ioctl+0x184/0x210 work around by doing kvmalloc_array instead. Signed-off-by: Gao Xu <[email protected]> Reviewed-by: Suren Baghdasaryan <[email protected]> Signed-off-by: Christoph Hellwig <[email protected]>
1 parent 4d3af20 commit 51ff97d

File tree

1 file changed

+2
-2
lines changed

1 file changed

+2
-2
lines changed

kernel/dma/remap.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,13 +43,13 @@ void *dma_common_contiguous_remap(struct page *page, size_t size,
4343
void *vaddr;
4444
int i;
4545

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

5454
return vaddr;
5555
}

0 commit comments

Comments
 (0)