doom13 0 29 декабря, 2016 Опубликовано 29 декабря, 2016 · Жалоба Приветствую. Необходимо выделить под буферы 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? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Eddy_Em 1 29 декабря, 2016 Опубликовано 29 декабря, 2016 · Жалоба В /etc/sysctl.conf ограничений по памяти нет? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
doom13 0 29 декабря, 2016 Опубликовано 29 декабря, 2016 · Жалоба В /etc/sysctl.conf ограничений по памяти нет? В системе нет такого файла, в Ubunt-e на ПК есть, а в системе на плате нет? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Jury093 2 29 декабря, 2016 Опубликовано 29 декабря, 2016 · Жалоба Необходимо выделить под буферы DMA 32 МБ памяти (128 буферов, память выделяется функцией dma_zalloc_coherent с флагом GFP_KERNEL), система отдаёт около 16 МБ, далее dma_zalloc_coherent возвращает нулевой указатель. вероятно у вас прописаны дефолтные 16МБ в корне исходников ядра: cat .config | grep CMA и смотрите параметр CONFIG_CMA_SIZE_MBYTES Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 63 29 декабря, 2016 Опубликовано 29 декабря, 2016 · Жалоба Добавьте к параметрам ядра cma=32M. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Гость nill 30 декабря, 2016 Опубликовано 30 декабря, 2016 · Жалоба Добавьте к параметрам ядра cma=32M. Тут стоит добавить, что CMA прозрачно используется через DMA API, и все драйверы, запрашивающие память через dma_alloc_coherent, получат свой кусочек. Так что 32M может и не хватить с учётом того, что в выводе /proc/meminfo кто-то уже откусил ~200 кб. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
doom13 0 30 декабря, 2016 Опубликовано 30 декабря, 2016 · Жалоба Спасибо. Проблема была именно в ограничении размера памяти при конфигурации ядра. Увеличил размер CMA до 128 МБ - перестал работать мой драйвер, возвращаю стандартные 16 МБ - опять всё работает? 64, 32 МБ - драйвер не работает. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
doom13 0 3 января, 2017 Опубликовано 3 января, 2017 · Жалоба Приветствую. Увеличиваю размер CMA - получаю какое-то странное поведение системы. На что ещё может влиять данный параметр (CONFIG_CMA_SIZE_MBYTES)? Используется плата zc706, Vivado 2015.4, Petalinux 2015.4, в системе используется отладчик ILA и при увеличении размера CMA даже он отваливается, но при этом файл прошивки FPGA не изменялся, меняется только образ ядра Linux и rootfs. Как??? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
krux 8 3 января, 2017 Опубликовано 3 января, 2017 · Жалоба тема выделения непрерывного участка памяти уже много лет в разных разделах этого форума обсуждалась с примерно одинаковым результатом. Общая концепция которого примерно следующая: Не спешите делать драйвер под одну ОС, просто ради "ура, заработало!". Вам придется выяснить, какие требования налагают разные ОС на выделение памяти для передачи данных из "железа" в пространство памяти ОС и обратно. И только после этого проектировать обмен. Итого, может оказаться, что 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. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
doom13 0 4 января, 2017 Опубликовано 4 января, 2017 · Жалоба тема выделения непрерывного участка памяти уже много лет в разных разделах этого форума обсуждалась с примерно одинаковым результатом. Общая концепция которого примерно следующая: Не спешите делать драйвер под одну ОС, просто ради "ура, заработало!". Вам придется выяснить, какие требования налагают разные ОС на выделение памяти для передачи данных из "железа" в пространство памяти ОС и обратно. И только после этого проектировать обмен. Итого, может оказаться, что 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 кБ. Память уже выделяется, при конфигурации ядра с опциями предложенными выше, но... (см. предыдущий пост) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться