Перейти к содержанию
    

Выделение памяти

Приветствую.

Необходимо выделить под буферы 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?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В /etc/sysctl.conf ограничений по памяти нет?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В /etc/sysctl.conf ограничений по памяти нет?

В системе нет такого файла, в Ubunt-e на ПК есть, а в системе на плате нет?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

вероятно у вас прописаны дефолтные 16МБ

в корне исходников ядра:

cat .config | grep CMA

и смотрите параметр CONFIG_CMA_SIZE_MBYTES

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Гость nill
Добавьте к параметрам ядра cma=32M.

Тут стоит добавить, что CMA прозрачно используется через DMA API, и все драйверы, запрашивающие память через dma_alloc_coherent, получат свой кусочек. Так что 32M может и не хватить с учётом того, что в выводе /proc/meminfo кто-то уже откусил ~200 кб.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо. Проблема была именно в ограничении размера памяти при конфигурации ядра.

Увеличил размер CMA до 128 МБ - перестал работать мой драйвер, возвращаю стандартные 16 МБ - опять всё работает? 64, 32 МБ - драйвер не работает.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Приветствую.

Увеличиваю размер CMA - получаю какое-то странное поведение системы. На что ещё может влиять данный параметр (CONFIG_CMA_SIZE_MBYTES)?

Используется плата zc706, Vivado 2015.4, Petalinux 2015.4, в системе используется отладчик ILA и при увеличении размера CMA даже он отваливается, но при этом файл прошивки FPGA не изменялся, меняется только образ ядра Linux и rootfs. Как???

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

тема выделения непрерывного участка памяти уже много лет в разных разделах этого форума обсуждалась с примерно одинаковым результатом.

Общая концепция которого примерно следующая:

Не спешите делать драйвер под одну ОС, просто ради "ура, заработало!".

 

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

И только после этого проектировать обмен.

 

Итого, может оказаться, что 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.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

тема выделения непрерывного участка памяти уже много лет в разных разделах этого форума обсуждалась с примерно одинаковым результатом.

Общая концепция которого примерно следующая:

Не спешите делать драйвер под одну ОС, просто ради "ура, заработало!".

 

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

И только после этого проектировать обмен.

 

Итого, может оказаться, что 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 кБ.

Память уже выделяется, при конфигурации ядра с опциями предложенными выше, но... (см. предыдущий пост)

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...