выделить большой (32 МБ) смежный регион - PullRequest
4 голосов
/ 26 августа 2011

Можно ли вообще выделить большие (то есть 32 МБ) физически смежные области памяти из кода ядра во время выполнения (то есть без использования bootmem)? Из моих экспериментов кажется, что невозможно получить что-то большее, чем 4-мегабайтный чанк, независимо от того, какие флаги GFP я использую. Согласно прочитанной мной документации, GFP_NOFAIL должен заставить kmalloc просто ждать столько времени, сколько необходимо для освобождения запрошенной суммы, но из того, что я могу сказать, это просто делает запрос зависшим на неопределенное время, если вы запрашиваете больше, чем доступно - похоже, что он не пытается активно освободить память для выполнения запроса (т.е. kswapd, похоже, не работает). Есть ли какой-нибудь способ сказать ядру, что нужно активно начинать замену, чтобы освободить запрошенное распределение?

Редактировать: Итак, из ответа Юджина я вижу, что невозможно получить 32-мегабайтную область из одного kmalloc-а ... но есть ли возможность сделать это более хакерским способом? Как определение самой большой доступной смежной области, затем ручная миграция / обмен данными по обе стороны от нее?

Или как-то так:

1) Grab a bunch of 4mb chunks until you're out of memory.
2) Check them all to see if any of them happen to be contiguous, if so,
   combine them.
3) kfree the rest
4) goto 1)

Может ли это сработать, если дать достаточно времени для запуска?

Ответы [ 2 ]

1 голос
/ 05 октября 2011

Возможно, вы захотите взглянуть на патчи непрерывного распределения памяти . Судя по статье LWN , эти патчи - именно то, что вам нужно.

0 голосов
/ 05 октября 2011

Ссылка Мирчи является одним из вариантов; если у вас есть IOMMU на вашем устройстве, вы можете использовать его для представления непрерывного просмотра набора несмежных страниц в памяти.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...