如何减少“ cma_alloc”的延迟?

时间:2019-02-25 09:49:26

标签: memory memory-management linux-kernel linux-device-driver embedded-linux

我正在使用cma保留内存并获得高延迟。

有什么方法可以减少cma分配延迟?

1 个答案:

答案 0 :(得分:0)

延迟可能是由于内核为了从请求中获取足够大的连续区域而将可移动页面(用于块设备缓存等)迁移到CMA之外。避免延迟的一种方法是在设备树中为设备保留一个特定的内存块,因此不必从全局CMA池中进行分配。

以下内容假设您正在开发使用设备树的嵌入式系统,并且可以修改驱动程序代码以使用保留的内存区域。

如果要保留专门用于设备的内存区域,则可以静态或动态保留该区域(让内核确定该区域的起始地址)。有关详细信息,请参见reserved-memory.txt

设置no-map属性可停止内核将内存映射为其标准系统内存的一部分。

如果您不希望内存被内核的其他部分(块页面缓存等)临时存储,请不要设置reusable属性。

如果要从缓冲区分配相干DMA内存,请设置compatible = "shared-dma-pool";。尽管该池是“共享的”,但仅由专门使用此保留内存区域的设备共享。

在设备节点中,将memory-region属性设置为引用保留内存区域的虚拟主机。

例如:

/ {
         /* ... */

         reserved-memory {
                 #address-cells = <1>;
                 #size-cells = <1>;
                 ranges;

                 my_dev_reserved: region_my_dev_buffer {
                         compatible = "shared-dma-pool";
                         no-map;
                         size = <0x02000000>; /* 32 MiB size */
                         alignment = <0x1000>; /* 4 KiB alignment */
                 };
         };

         /* ... */

         my_dev: mydev@xxxx {
                 compatible = "foo,barbaz-1.0";
                 /* ... */
                 memory-region = <&my_dev_reserved>;
                 /* ... */
         };

         /* ... */
};

在设备驱动程序的“探针”功能中,您可以调用of_reserved_mem_device_init(hwdev);(其中hwdev是指向硬件设备的struct device的指针,通常嵌入到其他结构中)例如struct platform_device)。返回值0表示设备将使用设备特定的保留内存进行连贯的DMA内存分配(如果区域的compatible字符串为"shared-dma-pool",否则连贯的DMA内存分配将下降回到使用全局池。

如果of_reserved_mem_device_init(hwdev);成功,则应在设备驱动程序的“删除”函数中调用of_reserved_mem_release(hwdev);以释放分配的资源。 (您可能还需要在“探针”功能的错误清除代码中调用它。)