On Wed, Dec 15, 2021 at 04:48:26AM +0000, Hyeonggon Yoo wrote:
Hello Baoquan and Vlastimil.
I'm not sure allowing ZONE_DMA32 for kdump kernel is nice way to solve this problem. Devices that requires ZONE_DMA is rare but we still support them.
If we allow ZONE_DMA32 for ZONE_DMA in kdump kernels, the problem will be hard to find.
Sorry, I sometimes forget validating my english writing :(
What I meant:
I'm not sure that allocating from ZONE_DMA32 instead of ZONE_DMA for kdump kernel is nice way to solve this problem.
Devices that requires ZONE_DMA memory is rare but we still support them.
If we use ZONE_DMA32 memory instead of ZONE_DMA in kdump kernels, It will be hard to the problem when we use devices that can use only ZONE_DMA memory.
What about one of those?:
1) Do not call warn_alloc in page allocator if will always fail to allocate ZONE_DMA pages. 2) let's check all callers of kmalloc with GFP_DMA if they really need GFP_DMA flag and replace those by DMA API or just remove GFP_DMA from kmalloc() 3) Drop support for allocating DMA memory from slab allocator (as Christoph Hellwig said) and convert them to use DMA32
(as Christoph Hellwig said) and convert them to use *DMA API*
and see what happens
Thanks, Hyeonggon.
Maybe the function get_capabilities() want to allocate memory even if it's not from DMA zone, but other callers will not expect that.
Yeah, I have the same guess too for get_capabilities(), not sure about other callers. Or, as ChristophL and ChristophH said(Sorry, not sure if this is the right way to call people when the first name is the same. Correct me if it's wrong), any buffer requested from kmalloc can be used by device driver. Means device enforces getting memory inside addressing limit for those DMA transferring buffer which is usually large, Megabytes level with vmalloc() or alloc_pages(), but doesn't care about this kind of small piece buffer memory allocated with kmalloc()? Just a guess, please tell a counter example if anyone happens to know, it could be easy.
kmalloc_caches[KMALLOC_DMA][i] = create_kmalloc_cache( kmalloc_info[i].name[KMALLOC_DMA], kmalloc_info[i].size,
-- 2.17.2