DMA属性 【ChatGPT】

发布时间 2023-12-09 16:48:56作者: 摩斯电码

DMA属性

本文档描述了在linux/dma-mapping.h中定义的DMA属性的语义。

DMA_ATTR_WEAK_ORDERING

DMA_ATTR_WEAK_ORDERING指定了对映射的读写可能是弱有序的,也就是说读和写可能会相互交错。

由于平台可以选择性地实现DMA_ATTR_WEAK_ORDERING,那些没有实现的平台将简单地忽略该属性并表现出默认行为。

DMA_ATTR_WRITE_COMBINE

DMA_ATTR_WRITE_COMBINE指定了对映射的写入可能会被缓冲以提高性能。

由于平台可以选择性地实现DMA_ATTR_WRITE_COMBINE,那些没有实现的平台将简单地忽略该属性并表现出默认行为。

DMA_ATTR_NO_KERNEL_MAPPING

DMA_ATTR_NO_KERNEL_MAPPING允许平台避免为分配的缓冲区创建内核虚拟映射。在某些架构上,创建这样的映射是一项非平凡的任务,并且消耗非常有限的资源(如内核虚拟地址空间或DMA一致地址空间)。使用此属性分配的缓冲区只能通过调用dma_mmap_attrs()传递到用户空间。通过使用此API,您保证不会对dma_alloc_attr()返回的指针进行解引用。您可以将其视为必须传递给dma_mmap_attrs()和dma_free_attrs()的cookie。确保每次调用这两个函数时也设置该属性。

由于平台可以选择性地实现DMA_ATTR_NO_KERNEL_MAPPING,那些没有实现的平台将简单地忽略该属性并表现出默认行为。

DMA_ATTR_SKIP_CPU_SYNC

默认情况下,dma_map_{single,page,sg}函数族将给定的缓冲区从CPU域传输到设备域。一些高级用例可能需要在多个设备之间共享缓冲区。这需要为每个设备单独创建映射,并且通常通过多次调用dma_map_{single,page,sg}函数来执行,每次传递给参与缓冲区共享的每个设备的设备指针。第一次调用将缓冲区从“CPU”域传输到“设备”域,这会同步给定区域的CPU缓存(通常意味着缓存已被刷新或根据DMA方向无效化)。然而,对于其他设备的dma_map_{single,page,sg}()的后续调用将在CPU缓存上执行完全相同的同步操作。CPU缓存同步可能是一个耗时的操作,特别是如果缓冲区很大,因此强烈建议尽可能避免。DMA_ATTR_SKIP_CPU_SYNC允许平台代码跳过对给定缓冲区的CPU缓存同步,假设它已经被传输到“设备”域。此属性也可用于dma_unmap_{single,page,sg}函数族,以在释放其映射后强制缓冲区保留在设备域中。谨慎使用此属性!

DMA_ATTR_FORCE_CONTIGUOUS

默认情况下,DMA映射子系统允许从dma_alloc_attrs()函数分配的缓冲区由单独的页面组装而成,如果可以将其作为连续块映射到设备DMA地址空间。通过指定此属性,分配的缓冲区将被强制在物理内存中也是连续的。

DMA_ATTR_ALLOC_SINGLE_PAGES

这是对DMA映射子系统的一种提示,表明尝试以提供更好的TLB效率的方式分配内存可能不值得(也就是说,尝试使用较大的页面构建映射可能不值得)。如果:

  • 您知道对该内存的访问不会导致TLB失效。您可能知道访问可能是顺序的,或者它们不是顺序的,但不太可能在不同物理页面上来回跳转。
  • 您知道访问内存时TLB缺失的惩罚很小,可以忽略不计。如果您正在进行解密或解压等大量操作,这可能是适用的情况。
  • 您知道DMA映射是相当短暂的。如果您预期映射的寿命很短,那么优化分配(避免使用大页面)可能是值得的,而不是获得较大页面的轻微性能优势。

设置此提示并不保证您不会获得大页面,但意味着我们不会那么努力地去获取它们。

注意
目前DMA_ATTR_ALLOC_SINGLE_PAGES仅在ARM上实现,尽管ARM64的补丁可能很快会发布。

DMA_ATTR_NO_WARN

这告诉DMA映射子系统抑制分配失败报告(类似于__GFP_NOWARN)。

在某些架构上,分配失败会通过错误消息报告到系统日志中。尽管这有助于识别和调试问题,但处理失败的驱动程序(例如,稍后重试)对此没有问题,并且实际上可能会用并非任何问题的错误消息淹没系统日志,这取决于重试机制的实现。

因此,这为驱动程序提供了一种在分配失败不是问题的调用上避免这些错误消息,并且不应该打扰日志的方法。

注意
目前DMA_ATTR_NO_WARN仅在PowerPC上实现。

DMA_ATTR_PRIVILEGED

一些高级外围设备,如远程处理器和GPU,在特权“监管员”和非特权“用户”模式下对DMA缓冲区执行访问。此属性用于指示DMA映射子系统缓冲区在提升的特权级别下是完全可访问的(理想情况下在较低特权级别下是不可访问的,或者至少是只读的)。