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

13 hours ago, faa said:

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

 

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

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


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

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

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


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

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.

 

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


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

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

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


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

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

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

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

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

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

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

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

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

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