dma

    xiaoxiao2021-03-25  113

    我们直到dma_alloc_coherent->dma_alloc_attrs static inline void *dma_alloc_attrs(struct device *dev, size_t size,                        dma_addr_t *dma_handle, gfp_t flag,                        unsigned long attrs) {     struct dma_map_ops *ops = get_dma_ops(dev);     void *cpu_addr;     BUG_ON(!ops);     if (dma_alloc_from_coherent(dev, size, dma_handle, &cpu_addr))         return cpu_addr;     if (!arch_dma_alloc_attrs(&dev, &flag))         return NULL;     if (!ops->alloc)         return NULL;     cpu_addr = ops->alloc(dev, size, dma_handle, flag, attrs);     debug_dma_alloc_coherent(dev, size, *dma_handle, cpu_addr);     return cpu_addr; } 而在dma_alloc_attrs 中会首先调用dma_alloc_from_coherent 会尝试从device自身的memory中分配memory。 int dma_alloc_from_coherent(struct device *dev, ssize_t size,                        dma_addr_t *dma_handle, void **ret) {     struct dma_coherent_mem *mem;     int order = get_order(size);     unsigned long flags;     int pageno;     int dma_memory_map;     if (!dev)         return 0;     mem = dev->dma_mem;     if (!mem)         return 0;     *ret = NULL;     spin_lock_irqsave(&mem->spinlock, flags);     if (unlikely(size > (mem->size << PAGE_SHIFT)))         goto err;     pageno = bitmap_find_free_region(mem->bitmap, mem->size, order);     if (unlikely(pageno < 0))         goto err;     /*      * Memory was found in the per-device area.      */     *dma_handle = mem->device_base + (pageno << PAGE_SHIFT);     *ret = mem->virt_base + (pageno << PAGE_SHIFT);     dma_memory_map = (mem->flags & DMA_MEMORY_MAP);     spin_unlock_irqrestore(&mem->spinlock, flags);     if (dma_memory_map)         memset(*ret, 0, size);     else         memset_io(*ret, 0, size);     return 1; err:     spin_unlock_irqrestore(&mem->spinlock, flags);     /*      * In the case where the allocation can not be satisfied from the      * per-device area, try to fall back to generic memory if the      * constraints allow it.      */     return mem->flags & DMA_MEMORY_EXCLUSIVE; } dma_alloc_from_coherent的实现首先从 mem = dev->dma_mem;中拿到memory信息再从这个mem中分配,可是遍历kernel中所有调用dma_alloc_coherent 的device自身都没有memory,从打印的log看一般都是在dma_alloc_from_coherent 函数中由于mem为null 返回了,还真没有见过自带memory的device.
    转载请注明原文地址: https://ju.6miu.com/read-11394.html

    最新回复(0)