Является ли __alloc_pages_slowpath() реентерабельным или нет?

Может ли вызов __alloc_pages_slowpath() пережить прерывание устройства, которое также вызывает вызов __alloc_pages_slowpath(), или второй вызов испортит первый?

Я вижу программный вызов read(2) обычного файла в файловой системе XFS. Трассировка стека ядра показывает, что в конечном итоге вызывается __alloc_pages_slowpath(), затем происходит IRQ e1000e, который также в конечном итоге вызывает __alloc_pages_slowpath(), а затем почти сразу появляется сообщение журнала «fooprog: ошибка выделения страницы. порядок: 0, режим: 0x4020».

Всю трассировку стека можно увидеть здесь: https://gist.github.com/790577.


person Community    schedule 21.01.2011    source источник


Ответы (1)


«fooprog: сбой выделения страницы. порядок: 0, режим: 0x4020» возникает из-за проблемы с драйвером e1000e. Удвоение текущего значения vm.min_free_kbytes предотвращает их. __alloc_pages_slowpath(), вероятно, безопасен для повторного входа.

Обновление: (1) это «нормальное поведение», когда огромные трассировки стека печатаются в системном журнале ядра Linux, когда драйвер сетевого устройства пытается выделить страницу и обнаруживает, что не может. (2) кто-то представил патч, и в течение шести месяцев он игнорировался, пока я вежливо не попросил их проследить за получением патча. После этого сеть KVM/qemu virtio перестала блокироваться, когда виртуальным машинам не хватило памяти. (3) альтернативы Linux, к сожалению, хуже для реальной работы.

person Community    schedule 24.01.2011
comment
Я предлагаю принять ваш ответ как «ответ», чтобы этот вопрос был удален из списка вопросов без ответа. :) - person sarnold; 31.01.2011