Приветствую!
Цитата(doom13 @ Sep 30 2015, 17:28)

Столкнулся с тем, что ядро Linux не хочет выделять непрерывное адресное пространство более 4 MBytes. Получается одним
...
А зачем Вам непрерывное пространство ?
Размер дескриптора 32 байта, а страницу 4k влазит 128 штук (небольшая карусельна ), ну а в 4M аж лень считать сколько (целое колесо обозрения получится

). Вы наверное пытаетесь еще и буфера тут же втиснуть. так это и не надо
буфера выделяются отдельно физическими блоками-страницами и линкуются в дескрипторы
В самом простом случае (размер физ страниц 4K) 128 дескрипторов мапят 512K буферов.
Теперь грубо считаем что хуже -
для маленьких пакетов 128 буферов это на ~7us полета
Для jumbo пакетов 512K - это ~512 us парения
С учетом того что типичное время обработки прерывания ~10-100 us если взять кольцо из 32*128 дескрипторов то можно быть уверен что драйвер гарантированно обработает прерывание и сможет :
пройти по кольцу от последней точки хвоста кольца дескрипторов до текущего положения головы
указатели на заполненные буера убрать из дескрипторов и отправить в очередь ленивому юзеру на обработку
выделить память под свободные буфера и заполнить указателями на них поля в вытирающих пот дескрипторах
вновь отправив их на тяжкий труд передвинув положение хвоста в соответствующем регистре ДМА
ДМА при этом на останавливается - так как будет иметь как минимум половину готовых дескрипторов для работы
В таком случае можно забить данными всю память которую только можно выделить
Успехов! Rob.