我正在使用cma保留内存,并且获得了高延迟。
有没有办法减少cma分配延迟?
发布于 2019-02-26 02:29:20
延迟可能是由于内核迁移可移动页面(对于块设备、缓存等)造成的。以便获得足够大的连续区域来满足您的请求。避免延迟的一种方法是在设备树中为您的设备保留一个特定的内存块,这样它就不必从全局CMA池中分配。
下面假设您正在开发使用设备树的嵌入式系统,并且可以修改驱动程序代码以使用保留的内存区域。
如果专门为您的设备保留一个内存区域,您可以静态或动态地保留该区域(让内核确定该区域的起始地址)。详情请参见reserved-memory.txt。
设置no-map属性以停止内核将内存映射为其标准系统内存的一部分。
如果不希望内核的其他部分(块、页、缓存等)将内存用于临时存储,请不要设置reusable属性。
如果您想从缓冲区中分配一致的DMA内存,请设置compatible = "shared-dma-pool";。尽管该池是“共享的”,但它仅由专门使用此保留内存区域的设备共享。
在设备节点中,将memory-region属性设置为引用保留内存区域的phandle。
例如:
/ {
/* ... */
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表示设备将使用特定于设备的保留内存进行一致的直接存储器访问内存分配(如果区域的compatible字符串为"shared-dma-pool",则一致的直接存储器访问内存分配将回退到使用全局池。
如果删除成功,您应该在设备驱动程序的“of_reserved_mem_device_init(hwdev);”函数中调用of_reserved_mem_release(hwdev);来释放分配的资源。(您可能还需要在“探测”函数的错误清除代码中调用它。)
https://stackoverflow.com/questions/54863397
复制相似问题