реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Выделение памяти
doom13
сообщение Dec 29 2016, 10:38
Сообщение #1


Профессионал
*****

Группа: Свой
Сообщений: 1 404
Регистрация: 11-03-11
Из: Минск, Беларусь
Пользователь №: 63 539



Приветствую.
Необходимо выделить под буферы DMA 32 МБ памяти (128 буферов, память выделяется функцией dma_zalloc_coherent с флагом GFP_KERNEL), система отдаёт около 16 МБ, далее dma_zalloc_coherent возвращает нулевой указатель.
Содержимое /proc/meminfo:
Код
MemTotal:        1032496 kB
MemFree:         1018988 kB
MemAvailable:    1016792 kB
Buffers:             932 kB
Cached:             3648 kB
SwapCached:            0 kB
Active:             4380 kB
Inactive:            888 kB
Active(anon):        700 kB
Inactive(anon):       24 kB
Active(file):       3680 kB
Inactive(file):      864 kB
Unevictable:           0 kB
Mlocked:               0 kB
HighTotal:        270336 kB
HighFree:         268172 kB
LowTotal:         762160 kB
LowFree:          750816 kB
SwapTotal:             0 kB
SwapFree:              0 kB
Dirty:                 4 kB
Writeback:             0 kB
AnonPages:           776 kB
Mapped:             2468 kB
Shmem:                36 kB
Slab:               3740 kB
SReclaimable:       1184 kB
SUnreclaim:         2556 kB
KernelStack:         400 kB
PageTables:           92 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:      516248 kB
Committed_AS:       2088 kB
VmallocTotal:     245760 kB
VmallocUsed:        3544 kB
VmallocChunk:     143740 kB
CmaTotal:          16384 kB
CmaFree:           16112 kB

после старта драйвера:
Код
CmaTotal:          16384 kB
CmaFree:             104 kB

Возможно ли увеличить размер CmaTotal?
Go to the top of the page
 
+Quote Post
Эдди
сообщение Dec 29 2016, 11:16
Сообщение #2


Знающий
****

Группа: Участник
Сообщений: 825
Регистрация: 16-04-15
Из: КЧР, Нижний Архыз
Пользователь №: 86 250



В /etc/sysctl.conf ограничений по памяти нет?
Go to the top of the page
 
+Quote Post
doom13
сообщение Dec 29 2016, 11:27
Сообщение #3


Профессионал
*****

Группа: Свой
Сообщений: 1 404
Регистрация: 11-03-11
Из: Минск, Беларусь
Пользователь №: 63 539



Цитата(Эдди @ Dec 29 2016, 14:16) *
В /etc/sysctl.conf ограничений по памяти нет?

В системе нет такого файла, в Ubunt-e на ПК есть, а в системе на плате нет?
Go to the top of the page
 
+Quote Post
Jury093
сообщение Dec 29 2016, 13:38
Сообщение #4


Знающий
****

Группа: Участник
Сообщений: 959
Регистрация: 11-01-06
Из: Санкт-Петербург
Пользователь №: 13 050



Цитата(doom13 @ Dec 29 2016, 13:38) *
Необходимо выделить под буферы DMA 32 МБ памяти (128 буферов, память выделяется функцией dma_zalloc_coherent с флагом GFP_KERNEL), система отдаёт около 16 МБ, далее dma_zalloc_coherent возвращает нулевой указатель.

вероятно у вас прописаны дефолтные 16МБ
в корне исходников ядра:
Код
cat .config | grep CMA

и смотрите параметр CONFIG_CMA_SIZE_MBYTES
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Dec 29 2016, 14:41
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Добавьте к параметрам ядра cma=32M.
Go to the top of the page
 
+Quote Post
nill
сообщение Dec 30 2016, 06:40
Сообщение #6


Частый гость
**

Группа: Validating
Сообщений: 124
Регистрация: 10-08-05
Пользователь №: 7 502



Цитата(aaarrr @ Dec 29 2016, 21:41) *
Добавьте к параметрам ядра cma=32M.

Тут стоит добавить, что CMA прозрачно используется через DMA API, и все драйверы, запрашивающие память через dma_alloc_coherent, получат свой кусочек. Так что 32M может и не хватить с учётом того, что в выводе /proc/meminfo кто-то уже откусил ~200 кб.
Go to the top of the page
 
+Quote Post
doom13
сообщение Dec 30 2016, 09:32
Сообщение #7


Профессионал
*****

Группа: Свой
Сообщений: 1 404
Регистрация: 11-03-11
Из: Минск, Беларусь
Пользователь №: 63 539



Спасибо. Проблема была именно в ограничении размера памяти при конфигурации ядра.
Увеличил размер CMA до 128 МБ - перестал работать мой драйвер, возвращаю стандартные 16 МБ - опять всё работает? 64, 32 МБ - драйвер не работает.
Go to the top of the page
 
+Quote Post
doom13
сообщение Jan 3 2017, 14:22
Сообщение #8


Профессионал
*****

Группа: Свой
Сообщений: 1 404
Регистрация: 11-03-11
Из: Минск, Беларусь
Пользователь №: 63 539



Приветствую.
Увеличиваю размер CMA - получаю какое-то странное поведение системы. На что ещё может влиять данный параметр (CONFIG_CMA_SIZE_MBYTES)?
Используется плата zc706, Vivado 2015.4, Petalinux 2015.4, в системе используется отладчик ILA и при увеличении размера CMA даже он отваливается, но при этом файл прошивки FPGA не изменялся, меняется только образ ядра Linux и rootfs. Как???
Go to the top of the page
 
+Quote Post
krux
сообщение Jan 3 2017, 14:36
Сообщение #9


Профессионал
*****

Группа: Свой
Сообщений: 1 700
Регистрация: 2-07-12
Из: дефолт-сити
Пользователь №: 72 596



тема выделения непрерывного участка памяти уже много лет в разных разделах этого форума обсуждалась с примерно одинаковым результатом.
Общая концепция которого примерно следующая:
Не спешите делать драйвер под одну ОС, просто ради "ура, заработало!".

Вам придется выяснить, какие требования налагают разные ОС на выделение памяти для передачи данных из "железа" в пространство памяти ОС и обратно.
И только после этого проектировать обмен.

Итого, может оказаться, что scatter-gather dma with lots of 16k linear alloc()-ed pages is better solution for your application with underlying HW acquisition system responding positively to this method as well.


--------------------
провоцируем неудовлетворенных провокаторов с удовольствием.
Go to the top of the page
 
+Quote Post
doom13
сообщение Jan 4 2017, 07:04
Сообщение #10


Профессионал
*****

Группа: Свой
Сообщений: 1 404
Регистрация: 11-03-11
Из: Минск, Беларусь
Пользователь №: 63 539



Цитата(krux @ Jan 3 2017, 17:36) *
тема выделения непрерывного участка памяти уже много лет в разных разделах этого форума обсуждалась с примерно одинаковым результатом.
Общая концепция которого примерно следующая:
Не спешите делать драйвер под одну ОС, просто ради "ура, заработало!".

Вам придется выяснить, какие требования налагают разные ОС на выделение памяти для передачи данных из "железа" в пространство памяти ОС и обратно.
И только после этого проектировать обмен.

Итого, может оказаться, что scatter-gather dma with lots of 16k linear alloc()-ed pages is better solution for your application with underlying HW acquisition system responding positively to this method as well.

Вы не правильно поняли вопрос, необходимо выделить для SgDMA два буфера. Каждый буфер из 128 дескрипторов по 128 кБ.
Память уже выделяется, при конфигурации ядра с опциями предложенными выше, но... (см. предыдущий пост)
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 7th July 2025 - 16:01
Рейтинг@Mail.ru


Страница сгенерированна за 0.01441 секунд с 7
ELECTRONIX ©2004-2016