LINUX.ORG.RU

PCI - выделение DMA памяти


0

2

Возникла следующая проблема. PCI устройство функционирует в нескольких режимах. В одном из режимов, драйверу для работы с устройством необходим DMA буфер размером 8Мб. Для выделения буфера использую pci_alloc_consistent (целевое ядро 2.6.32, x86_64). Максимальный объём непрерывной физической памяти, который получается выделить подобным путём - 4Мб (ни страницей больше!!!). Копаясь в исходиках ядра, удалось найти константу, которая задаёт макс. размер памяти, который возможно выделить подобным путём - MAX_ORDER: http://lxr.free-electrons.com/source/include/linux/mmzone.h?v=2.6.32#L24

#define MAX_ORDER 11

Это означает что можно выделить до 8Мб (PAGE_SIZE == 4096 == 2^12 -> 2^12 * 2^11 == 2^23 == 8Mb).

Собственно вопрос - почему 4Мб это максимальный объём DMA памяти, который я могу выделить для PCI устройства?

Если тебе реально нужен кусок непрерывной памяти - мои соболезнования. Твое устройство делали лохи, не слышавшие о scatter-gather.

tailgunner ★★★★★
()

Есть опция ядра, забыл как называется, ограничение количества используемого озу под страницы. Так вот, перегружаешь ядро с этой опцией и используешь эту память напрямую, потому-что ядро всё равно эту память не будет использовать ни для чего. Но за это расстреливают в приличных домах, так сказать. И после жертва попадает в програмистский адъ, где ты будешь писать сайты на машинных кодах, без дебагера и утилиты as, а дедлайн сегодня ночь. Платить тебе за это вообще не будут, ты даже должен будешь. В общем про эту опцию не я тебе сказал.

Да, и это, у некоторых не шибко умных карточек маска есть для ппд адресов. Ты проверь на всякий случай, а то может этот способ и не заработает.

nanoolinux ★★★★
()

Собственно вопрос - почему 4Мб это максимальный объём DMA памяти, который я могу выделить для PCI устройства?

Потому-что для dma нужен кусок физически непрерывной памяти. А она вся на страницы разбита. Ну нет у ядра непрерывного куска памяти размером 8 МБ.

nanoolinux ★★★★
()
Ответ на: комментарий от nanoolinux

Кстати, на всяких армах, где куча дсп и прочей фигни имеют свои буфера в одной памяти с AP, так всю жизнь и делали - часть памяти не давали ядру, и она была статично распределена между устройствами.

Вообще, в андроиде был костыль для этого - pmem назывался, а недавно в апстрим запихнули CMA фреймворк (contiguous memory allocation) для arm и x86.

alexst
()
Ответ на: комментарий от alexst

Вообще, в андроиде был костыль для этого - pmem назывался, а недавно в апстрим запихнули CMA фреймворк (contiguous memory allocation) для arm и x86.

Костыли для устройств, сделанных малограмотными индусами для других малограмотных индусов. И в 2.6.32 на x86_64 этого, естественно, нет.

tailgunner ★★★★★
()
Ответ на: комментарий от alexst

андроид на костылях.png

Я огорчён. Только надумал поменять свою цветную нокию 6030 с 16 канальной полифонией на андроидофон, а тут такое разочарование.

nanoolinux ★★★★
()

Если драйвер грузится сразу после загрузки системы, то можно выделить две ORDER-11 странички, и они почти стопроцентно будут находиться физически друг за другом. Если ядро посвежее, то есть /proc/sys/vm/compact_memory.

У нас так и делается, всё нормально работает. Спокойно выделяем 0.5-1 гб памяти в DMA32-области.

mv ★★★★★
()
#define MAX_ORDER 11

Это означает что можно выделить до 8Мб (PAGE_SIZE == 4096 == 2^12 -> 2^12 * 2^11 == 2^23 == 8Mb).

Это означает, что ты можешь выделить не более, чем (1 << (MAX_ORDER - 1)) страниц. У этой переменной неудачное название, но так уж исторически сложилось.

ttnl ★★★★★
()
Ответ на: комментарий от tailgunner

Твое устройство делали лохи, не слышавшие о scatter-gather.

Плюсую

ttnl ★★★★★
()
Ответ на: комментарий от mv

Если драйвер грузится сразу после загрузки системы, то можно выделить две ORDER-11 странички, и они почти стопроцентно будут находиться физически друг за другом. Если ядро посвежее, то есть /proc/sys/vm/compact_memory.

У нас так и делается, всё нормально работает. Спокойно выделяем 0.5-1 гб памяти в DMA32-области.

Если каждый раз выделяется, то почему вместо этого не резервируешь ее единожды в начале загрузки? На пробежку buddy по 1Гб тратиться до хрена тактов. Ужас, короче говоря.

Функция e820_add_region или как там на x86. Есть даже функции для резервации непосредственно перед инициализацией аллокатора.

ttnl ★★★★★
()
Ответ на: комментарий от tailgunner

Костыли для устройств, сделанных малограмотными индусами

ты типа грамотный :) там твой scatter/gather никому не впился - это скоростные устройства подключенные мастером на шине наряду с контроллером DMA через который работают низкоскоростные устройства (где и применяется scatter/gather) и ЦПУ. На некоторых SoC бывает 5-7 процессорных ядер - основное и различные периферийные и всем нужна для работы RAM.

bakugan
()
Ответ на: комментарий от mv

и они почти стопроцентно будут находиться физически друг за другом

Наблюдение конечно полезное, но не хочется полагаться на случай. Если б можно было это как-то гарантировать.

По сути, интересует - есть ли в vanila ядре ограничение на максимальный размер непрерывной DMA памяти. Если есть, то какое? Ответ, видимо находится здесь:

if (order >= MAX_ORDER) {
       WARN_ON_ONCE(!(gfp_mask & __GFP_NOWARN));
        return NULL;
}

aerosmith
() автор топика
Ответ на: комментарий от bakugan

ты типа грамотный :) там твой scatter/gather никому не впился - это скоростные устройства подключенные мастером на шине наряду с контроллером DMA

посмотри спецификации на xHCI(usb 3.0 контроллер) и на intel i82599(10 и 1 gigabit ethernet) и там и там не используется куски по мегабайтам. я, надеюсь, это достаточно скоростные устройства.

dimon555 ★★★★★
()
Ответ на: комментарий от bakugan

Костыли для устройств, сделанных малограмотными индусами

ты типа грамотный :)

Ага.

там твой scatter/gather никому не впился

Конечно, конечно. А CMA сделали просто по приколу.

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

Даже параметр mem= не можете поставить?

Такой вариант у нас тоже есть. Но т.к. выставляем не мы, а тупые клиенты, то проблемы на регулярной основе возникают у каждого первого тупого клиента. Я уже говорил, что клиенты тупые?

mv ★★★★★
()
Ответ на: комментарий от aerosmith

Наблюдение конечно полезное, но не хочется полагаться на случай. Если б можно было это как-то гарантировать.

Работает на зоопарке от 5-й шапки до свежайшего арчика через убунты, федоры и суси. Единственная проблема - это фрагментация памяти через некоторое время работы оси. Решается или compact_memory, или загрузкой драйвера вскорости после ребута.

mv ★★★★★
()
Ответ на: комментарий от mv

Трата тактов.

Кем и на что?

Нашим железом. На трансляцию адреса.

Там той трансляции... счетчик адресов растет не монотонно, а в зависимости от таблицы. Я, конечно, не знаю VHDL, но сильно подозреваю, что на это тратятся не такты, а вентили. И еще я подозреваю, что затраты на эту «трансляцию» тонут в шуме.

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

Там той трансляции... счетчик адресов растет не монотонно, а в зависимости от таблицы. Я, конечно, не знаю VHDL, но сильно подозреваю, что на это тратятся не такты, а вентили. И еще я подозреваю, что затраты на эту «трансляцию» тонут в шуме.

Тратятся такты. Причём, на фоне длины конвейера всего 19 тактов, каждый дополнительный такт на не понять что - это натуральная кража.

mv ★★★★★
()
Ответ на: комментарий от tailgunner

Это вместе с извлечением данных из оперативно памяти?

Это от начала приёма UDP пакета до выхлопа обработанных данных.

mv ★★★★★
()
Ответ на: комментарий от mv

Я спрашивал, входит ли в эти 19 циклов выборка из оперативной памяти компьютера (насколько я понимаю, память лежит по другую сторону PCI от вашей железки), потому что «трансляция» адреса просиходит только при обращении к ОП.

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

Я говорю про железку, которая делает или не делает трансляцию.

потому что «трансляция» адреса просиходит только при обращении к ОП.

С чего бы вдруг?

mv ★★★★★
()
Ответ на: комментарий от tailgunner

Твое устройство делали лохи, не слышавшие о scatter-gather

Ну к чему эти сопли жевать? Лохи, индусы, китайцы... Есть требования - их нужно соблюсти, или обосновать почему это невозможно сделать. Ты, не лох, столько текста написал, хоть бы раз на код сослался...

aerosmith
() автор топика
Ответ на: комментарий от aerosmith

Ну к чему эти сопли жевать?

Не жуй.

Лохи, индусы, китайцы... Есть требования - их нужно соблюсти

Видишь ли, есть ситуации, когда проще изменить требования. Если разработчики железа сидят в соседней комнате, можно просто подойти к ним и сказать «парни, а не можете ли вы сделать scatter-gather?».

Ты, не лох, столько текста написал, хоть бы раз на код сослался...

Все ссылки (bigphysarea, mem=, ранняя загрузка, compaction) тебе даны. А ты до сих пор сопли жуешь.

tailgunner ★★★★★
()
Ответ на: комментарий от mv

потому что «трансляция» адреса просиходит только при обращении к ОП.

С чего бы вдруг?

С того, что s/g - это способ взаимодействия устройства (DMA-мастера) с оперативной памятью компьютера.

tailgunner ★★★★★
()
Ответ на: комментарий от aerosmith

Да я понял что ты козёл - не оправдывайся...

Ну, хочешь жевать и дальше - дело твое.

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

С того, что s/g - это способ взаимодействия устройства (DMA-мастера) с оперативной памятью компьютера.

Таблицу трансляции надо где-то держать. Для сотен мегабайт она будет немаленькой. В FPGA слишком жирно держать, во внешней памяти - очень медленно. Кроме того, сама трансляция ест такты. Оно нужно для low latency девайса? Правильно, не нужно.

mv ★★★★★
()
Ответ на: комментарий от dimon555

посмотри спецификации на xHCI(usb 3.0 контроллер) и на intel i82599(10 и 1 gigabit ethernet) и там и там не используется куски по мегабайтам. я, надеюсь, это достаточно скоростные устройства.

Зачем на них смотреть - это «тупые» контроллеры, которым память нужна для буферов (кроме встроенных быстрых и небольших по размеру FIFO). Речь о сопроцессорах типа DSP, контроллерах HD Video in/out, GPU - типичный набор современных SoC, для них латентность доступа очень критична.

bakugan
()
Ответ на: комментарий от mv

С того, что s/g - это способ взаимодействия устройства (DMA-мастера) с оперативной памятью компьютера.

Таблицу трансляции надо где-то держать.

Нужно ли ее держать - зависит от архитектуры устройства. Если данные просто передаются из памяти машины в память устройства - держать таблицу трансляции не нужно; если вы постоянно лазите в ОП компьютера - нужно.

Для сотен мегабайт она будет немаленькой. В FPGA слишком жирно держать, во внешней памяти - очень медленно.

Мегабайт для гигабайта. AFAIK, на ПЛИС примерно для этих целей есть BRAM (и можно поставить дополнительную память).

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

Нужно ли ее держать - зависит от архитектуры устройства. Если данные просто передаются из памяти машины в память устройства - держать таблицу трансляции не нужно; если вы постоянно лазите в ОП компьютера - нужно.

Приведи пример.

Мегабайт для гигабайта. AFAIK, на ПЛИС примерно для этих целей есть BRAM (и можно поставить дополнительную память).

Любой внешний RAM - это медленно.

Скажи, а этот весь геморрой ради SGDMA, он точно нам нужен? :)

mv ★★★★★
()
Ответ на: комментарий от mv

Если данные просто передаются из памяти машины в память устройства - держать таблицу трансляции не нужно; если вы постоянно лазите в ОП компьютера - нужно.

Приведи пример.

Я уже не знаю, какие примеры тебе приводить. Скажи, когда, _по-твоему_ используется эта таблица трансляции?

Скажи, а этот весь геморрой ради SGDMA, он точно нам нужен? :)

Вам решать, милее вам геморрой с s/g или с гигабайтовой аллокацией. Я не стараюсь всучить вам SGDMA, а пытаюсь понять, почему вы его не используете. Пока не понимаю.

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

Я уже не знаю, какие примеры тебе приводить. Скажи, когда, _по-твоему_ используется эта таблица трансляции?

Да каждый раз, как происходит переход через границу линейного диапазона страниц.

Вам решать, милее вам геморрой с s/g или с гигабайтовой аллокацией.

Так геморра с аллокацией никакого нет. Нет, ну, конечно, обидно, что физическую память нельзя выделить ровно столько, сколько хочется, но не так обидно, как невозможность полной изоляции процессора от операционной системы.

mv ★★★★★
()
Ответ на: комментарий от mv

Скажи, когда, _по-твоему_ используется эта таблица трансляции?

Да каждый раз, как происходит переход через границу линейного диапазона страниц.

Ыыы... какие действия вызывают обращение к страницам? Например, вызывает ли обращение к страницам ОП хост-машины приход того самого UDP-пакета, на который вы отвечаете за 19 тактов?

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

Ыыы... какие действия вызывают обращение к страницам? Например, вызывает ли обращение к страницам ОП хост-машины приход того самого UDP-пакета, на который вы отвечаете за 19 тактов?

В одном UDP-пакете несколько сообщений. На каждое сообщение может генерироваться своя pcie-транзакция с записью в память.

mv ★★★★★
()
Ответ на: комментарий от mv

То есть ты говоришь, что в эти 19 тактов входит передача данных по PCIe? Если не секрет, какова длительность такта?

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

То есть ты говоришь, что в эти 19 тактов входит передача данных по PCIe? Если не секрет, какова длительность такта?

Нет, длительность передачи по PCI-e от нас не зависит. У нас такт 20 нс. Вариант с SG у нас прорабатывался, но он 4 или 5 лишних тактов ел, поэтому был свёрнут.

mv ★★★★★
()
Ответ на: комментарий от mv

длительность передачи по PCI-e от нас не зависит

Ну о чем и речь. Трансляция адреса - это просто довесок к передаче по PCIe, которую и без трансляции можно считать недтерминированной (и которая у вас наверняка выполняется каким-то асинхронным блоком).

Вариант с SG у нас прорабатывался, но он 4 или 5 лишних тактов ел

Когда встречу наших электронщиков, попробую спросить.

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

Ну о чем и речь. Трансляция адреса - это просто довесок к передаче по PCIe, которую и без трансляции можно считать недтерминированной (и которая у вас наверняка выполняется каким-то асинхронным блоком).

Трансляция адреса будет во внутренней статистике показываться. А 20% лишних процентов из-за SG нам нафиг не нужно.

К тому же, прототип выделения дофига физически линейной памяти я на системтапе за полвечера поддатым наваял, а железячники SG хз сколько бы осиливали. В Альтеровском IP, вроде, его нету.

mv ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.