Как уменьшить задержку для 'cma_alloc'? - PullRequest
0 голосов
/ 25 февраля 2019

Я работаю с зарезервированной памятью cma и получаю высокую задержку.

Есть ли способ уменьшить задержку выделения cma?

1 Ответ

0 голосов
/ 25 февраля 2019

Задержка, вероятно, связана с тем, что ядро ​​перемещает подвижные страницы (для кэшей блочных устройств и т. Д.) Из 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); в функции «удалить» драйвера вашего устройства, чтобы освободить выделенные ресурсы. (Возможно, вам также потребуется вызвать его в коде устранения ошибокВаша функция "зондирования".)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...