对于DMA分配,除了提供dma_alloc_coherent()这类可以提供大的内存分配和映射函数外,DMA POOL同样可以申请内存并进行映射。DMA POOL最终还是调用dma_alloc_coherent(),但其对进行管理,能提高小内存分配和申请的效率。

       DMA POOL在申请内存时至少分配PAGE_SIZE即一页,并根据用户要求分配的大小size对PAGE进行切分,并将可用的多个SIZE块串起来,这样在第一次申请内存时会真实申请内存,后面可以从前面申请的页中找到空闲SIZE块。

 (1)第一次分配时初始化

(2)第一次分配后

(3)第二次分配时

(4)第一次分配的内存释放后

从上面分析可以看出:

  1. 在size较小时,实际一次物理申请页过程可以给用户多次用,不需要每次都去实际申请页,节省申请物理页时间,但在size等于或超过PAGE_SIZE,实际上优势不存在;
  2. 整个pool池分配和释放过程实际上是加锁的,在IO频繁时,仍需要反复访问pool->lock,实际性能不会理想。

性能调优建议:尽量不要用动态分配内存,否则会造成性能瓶颈;尽可能提前静态分配所需要的内存,如果提前分配好所有内存确实占用内存过大,可以静态+动态分配(即静态分配能满足绝大部分IO的内存需要,当少数不满足的情况时再动态分配)

更多推荐

DMA POOL简单分析