dmitry-tomsk 0 December 21, 2022 Posted December 21, 2022 · Report post 13 hours ago, faa said: А опрос через pio регистра состояния без пауз/таймаутов? пауза for (int i = 0; i < 10000; i++). Менял на 100000 без разницы. Сейчас другой работой занят, на следующей неделе буду дальше копать. Quote Share this post Link to post Share on other sites More sharing options...
Alex77 3 December 21, 2022 Posted December 21, 2022 · Report post какбы такие паузы компилятор просто игнорирует (выбрасывает). Quote Share this post Link to post Share on other sites More sharing options...
1891ВМ12Я 0 December 23, 2022 Posted December 23, 2022 · Report post On 12/14/2022 at 5:28 AM, dxp said: Это в DMA режиме или в PIO? Конфигурация линка какая (сколько лейнов в линке)? Прошу прощения за небольшой оффтопичек, хотя всё же вопрос очень близок к теме. На платформе Linux есть dma_alloc_coherent и оно дает буфер смежный. Его можно один раз выделить и пользоваться им "вечно". Но я и сам это видел, что нельзя выделить буфер большой, иногда проблемы, предположительно из за фрагментации, не позволяли даже взять буфер 128 килобайт. С тех пор я решал эту проблему выделением N страниц памяти и постоянным обменом этими адресами с устройством, хотя coherent dma очень удобно И тут я узнал про CMA, ни один линуксоид не упоминал про эту штуку на тематических форумах, и оно позволяет выделить слитный кусок coherent dma памяти да хоть 32 гигабайта! Система резевирует отдельную область при старте. Есть ли какие то проблемы с этим механизмом? Накладные расходы, сложности? Падение производительности? Тут подробнее https://stackoverflow.com/questions/56508117/how-to-allocate-large-contiguous-memory-regions-in-linux dma_alloc_coherent(&pdev->dev, dbsize, paddr, GFP_KERNEL); // dbsize may specify up to 32G. Подумать только 32 гигабайта, а мне и 16 мегабайт будет большой помощью Quote Share this post Link to post Share on other sites More sharing options...
faa 1 December 24, 2022 Posted December 24, 2022 · Report post 10 часов назад, 1891ВМ12Я сказал: И тут я узнал про CMA, ни один линуксоид не упоминал про эту штуку на тематических форумах, и оно позволяет выделить слитный кусок coherent dma памяти да хоть 32 гигабайта! Система резевирует отдельную область при старте. Есть ли какие то проблемы с этим механизмом? Накладные расходы, сложности? Падение производительности? Тут подробнее https://stackoverflow.com/questions/56508117/how-to-allocate-large-contiguous-memory-regions-in-linux dma_alloc_coherent(&pdev->dev, dbsize, paddr, GFP_KERNEL); // dbsize may specify up to 32G. Подумать только 32 гигабайта, а мне и 16 мегабайт будет большой помощью CMA должен быть включен в ядре, что не во всех дистрибутивах сделано. Или ядро пересобирать надо. Есть еще варианты: 1. В проекте wupper драйвер cmem собирает обычные 4К странички в непрерывную область с проверкой неразрывности физ.адресов. CMA не используют. Но если затребовать буфер большого размера, то это может происходить очень долго и не всегда успешно. 2. Наши программисты через HugePage выделяют буфера, в cmdline размер HP установлен в макс.допустимый для платформы, отдельный драйвер преобразует вирт.адреса HP в физические. Только макс.размер HP может отличаться на разных платформах: на x86_64 он 1G, на aarch64 512M. Но в этом способе еще нюанс: HP надо выделять на правильной ноде, где пристегнут endpoint с dma. Quote Share this post Link to post Share on other sites More sharing options...
dmitry-tomsk 0 December 24, 2022 Posted December 24, 2022 · Report post 11 hours ago, 1891ВМ12Я said: Прошу прощения за небольшой оффтопичек, хотя всё же вопрос очень близок к теме. На платформе Linux есть dma_alloc_coherent и оно дает буфер смежный. Его можно один раз выделить и пользоваться им "вечно". Но я и сам это видел, что нельзя выделить буфер большой, иногда проблемы, предположительно из за фрагментации, не позволяли даже взять буфер 128 килобайт. С тех пор я решал эту проблему выделением N страниц памяти и постоянным обменом этими адресами с устройством, хотя coherent dma очень удобно И тут я узнал про CMA, ни один линуксоид не упоминал про эту штуку на тематических форумах, и оно позволяет выделить слитный кусок coherent dma памяти да хоть 32 гигабайта! Система резевирует отдельную область при старте. Есть ли какие то проблемы с этим механизмом? Накладные расходы, сложности? Падение производительности? Тут подробнее https://stackoverflow.com/questions/56508117/how-to-allocate-large-contiguous-memory-regions-in-linux dma_alloc_coherent(&pdev->dev, dbsize, paddr, GFP_KERNEL); // dbsize may specify up to 32G. Подумать только 32 гигабайта, а мне и 16 мегабайт будет большой помощью под windows windriver выдаёт склеенные страницы, когда делаешь lock памяти уровня пользователя. Склеивает до 144 страниц, в результате число дескрипторов меньше числа страниц в среднем в 10 раз. Блочной памяти 4kx64бит хватает для описания 160 МБайт памяти. Quote Share this post Link to post Share on other sites More sharing options...