struct dma_pool *dmam_pool_create(const char *name, struct device *dev, size_t size, size_t align, size_t allocation) (2)dmapool销毁接口 void dmam_pool_destroy(struct dma_pool *pool) (3)dmapool内存分配接口 void *dma_pool_alloc(struct dma_pool *pool, gfp_t mem_flags, dma_addr_t...
[ 656.175800] BUG: unable to handle kernel NULL pointer dereference at (null) [ 656.183656] IP: [<ffffffff8880f13b>] dma_pool_alloc+0x1ab/0x280 [ 656.189596] PGD 0 [ 656.191638] Oops: 0000 [#1] SMP [..] [ 656.307084] CPU: 18 PID: 17160 Comm: kworker/18:2 Kdump: loaded Tainted...
dma_pool_free(pool,cpu_addr,dma_handle); 其中pool 是传递给 dma_pool_alloc() 的内容,cpu_addr 和 dma_handle 是 dma_pool_alloc() 返回的值。 该函数可以在中断上下文中调用 销毁dma_pool: 代码语言:javascript 复制 dma_pool_destroy(pool); 确保在销毁池之前已为从池分配的所有内存调用 dma_pool_fr...
与dma_alloc_coherent()一样,这将返回两个值:CPU可用的地址和池设备可用的DMA地址。 void dma_pool_free(structdma_pool *pool,void*vaddr, dma_addr_taddr) 将内存放回池中。池是传递给dma_pool_alloc()的内容;CPU(vaddr)和DMA地址是该例程分配的内存被释放时返回的内容。 void dma_pool_destroy(structd...
dev, "Failed to alloc DMA_HardWare_Descriptor memory\n"); // 失败了就把所有硬件描述符的内存释放了 // 第一个描述符记录在taskDesc中 physical_addr = taskDesc->physical_addr; hardwareDesc = taskDesc->virtual_addr; temp_hardwareDesc = hardwareDesc; while(temp_hardwareDesc) { dma_pool_free(...
3、dma pool 如果你的驱动需非常多的小的dma buffer,那么dma pool是最适合你的机制。这个概念类似kmem_cache,__get_free_pages往往获取的是连续的page frame,而kmem_cache是批发了一大批page frame,然后自己“零售”。dma pool就是通过dma_alloc_coherent接口获取大块一致性的DMA内存,然后驱动可以调用dma_pool_all...
原因:可能是由于内存对齐问题、DMA缓冲区分配失败或硬件故障。解决方法: 确保使用正确的内存对齐。 使用dma_alloc_coherent()或dma_pool_alloc()分配DMA缓冲区。 检查硬件状态和日志,排查硬件故障。 示例代码 代码语言:txt 复制 #include <linux/dma-mapping.h> struct device *dev; void *virt_addr; dma_addr_...
对于dma_pool接口也一样。 dma_alloc_coherent返回两个值:一个处理可以使用的虚拟地址和一个设备卡可以使用的dma_handle。 处理器的返回地址及DMA总线地址是最小的页的幂次方对齐,返回的缓冲区的大小会大于或者等于申请的size。比如你申请的缓存区小于或者等于64KB,那么返回的缓冲区大小不会超过64KB。 如果想取消...
Avoid double-memset of the same allocated memory in dma_pool_alloc() when both DMAPOOL_DEBUG is enabled and init_on_alloc=1. Link: https://lkml.kernel.org/r/20230126215125.4069751-6-kbusch@meta.com Fixes: 2d55c16 ("dmapool: create/destroy cleanup") Signed-off-by: Tony Battersby <ton...
(i.e.kmalloc()orkmem_cache_alloc()) then you may DMA to/from that memory using the addresses returned from those routines. 如果您通过页面分配器(即 __get_free_page*())或通用内存分配器(即 kmalloc() 或 kmem_cache_alloc())获取内存,那么您可以使用这些例程返回的地址将内存 DMA 到/从内存 ...