|
|
  |
Выделение памяти |
|
|
|
Dec 29 2016, 10:38
|
Профессионал
    
Группа: Свой
Сообщений: 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?
|
|
|
|
|
Dec 29 2016, 13:38
|
Знающий
   
Группа: Участник
Сообщений: 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
|
|
|
|
|
Dec 30 2016, 06:40
|
Частый гость
 
Группа: 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 кб.
|
|
|
|
|
Jan 4 2017, 07:04
|
Профессионал
    
Группа: Свой
Сообщений: 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 кБ. Память уже выделяется, при конфигурации ядра с опциями предложенными выше, но... (см. предыдущий пост)
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|