1

从LDD3第214页:

GFP_NOIO
GFP_NOFS
这些标志的功能类似于 GFP_KERNEL,但是它们对内核可以做什么来满足请求添加了限制。GFP_NOFS 分配不允许执行任何文件系统调用,而 GFP_NOIO 根本不允许启动任何 I/O。它们主要用于文件系统和虚拟内存代码中,在这些代码中分配可能被允许休眠,但递归文件系统调用将是一个坏主意。

我想知道当 GFP_NOFS 被屏蔽时,为什么递归文件系统调用是一个坏主意?

谢谢!

4

1 回答 1

1

我想知道为什么递归文件系统调用是一个坏主意,当 GFP_NOFS 是 masktd 时?

它是另一种方式:你用GFP_NOFS信号,分配可以休眠,但不能与文件系统交互(例如:将一些内存块转储到磁盘以腾出一些空闲内存)。它是在代码的关键区域完成的。
例如:您输入了文件系统调用,为该文件系统锁定了一些全局互斥锁,称为 kmalloc。如果 kmalloc 将尝试调用另一个文件系统函数,该函数将锁定同一个互斥体 - 我们将陷入死锁。所以我们提供GFP_NOFS标志。

于 2015-12-30T07:41:59.457 回答