Jump to content
    

PCIe - начало...

13 hours ago, faa said:

А опрос через pio регистра состояния без пауз/таймаутов?

 

пауза for (int i = 0; i < 10000; i++). Менял на 100000 без разницы. Сейчас другой работой занят, на следующей неделе буду дальше копать.

Share this post


Link to post
Share on other sites

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 мегабайт будет большой помощью

Share this post


Link to post
Share on other sites

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.

 

Share this post


Link to post
Share on other sites

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 МБайт памяти.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...