Почему рекурсивные вызовы файловой системы были бы плохой идеей, когда GFP_NOFS маскируется

Со страницы LDD3 214:

GFP_NOIO
GFP_NOFS
Эти флаги действуют как GFP_KERNEL, но они добавляют ограничения на то, что ядро ​​может сделать, чтобы удовлетворить запрос. Распределению GFP_NOFS не разрешено выполнять какие-либо вызовы файловой системы, в то время как GFP_NOIO вообще не разрешает инициировать какой-либо ввод-вывод. Они используются главным образом в файловой системе и коде виртуальной памяти, где выделение может быть разрешено спать, но рекурсивные вызовы файловой системы были бы плохой идеей.

Я хочу знать, почему рекурсивные вызовы файловой системы - плохая идея, когда GFP_NOFS маскируется?

Спасибо!

1 ответ

Решение

Я хочу знать, почему рекурсивные вызовы файловой системы - плохая идея, когда GFP_NOFS - masktd?

Это наоборот: вы используете GFP_NOFS сигнализировать, что распределение может спать, но не может взаимодействовать с файловой системой (например: выгрузить некоторый блок памяти на диск, чтобы освободить память). Это сделано в критических областях кода.
Например: вы ввели вызов файловой системы, заблокировали некоторый глобальный мьютекс для этой файловой системы, который называется kmalloc. Если kmalloc попытается вызвать другую функцию файловой системы, которая блокирует тот же мьютекс - у нас будет тупик. Итак, мы предоставляем GFP_NOFS флаг.

Другие вопросы по тегам