Linux kernel 为什么当GFP_NOFS被屏蔽时,递归文件系统调用是个坏主意

Linux kernel 为什么当GFP_NOFS被屏蔽时,递归文件系统调用是个坏主意,linux-kernel,filesystems,kernel,kmalloc,Linux Kernel,Filesystems,Kernel,Kmalloc,从LDD3第214页: GFP_NOIO GFP_NOFS 这些标志的功能类似于GFP_内核,但它们增加了内核满足请求的限制。GFP_NOFS分配不允许执行任何文件系统调用,而GFP_NOIO完全不允许启动任何I/O。它们主要用于文件系统和虚拟内存代码中,在这些代码中,分配可能被允许休眠,但是递归文件系统调用是个坏主意。 我想知道为什么当GFP_NOFS被屏蔽时,递归文件系统调用是个坏主意 谢谢 我想知道为什么当GFP_NOFS是masktd时,递归文件系统调用是个坏主意 另一种方法是:使用GF

从LDD3第214页:

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

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

谢谢

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

另一种方法是:使用
GFP\u NOFS
来表示分配可以休眠,但不能与文件系统交互(例如:将一些内存块转储到磁盘以释放一些内存)。它是在代码的关键区域完成的。

例如:您输入了filesystem call,为这个文件系统锁定了一些全局互斥对象,称为kmalloc。如果kmalloc尝试调用另一个文件系统函数,该函数将锁定同一个互斥锁-我们将出现死锁。因此,我们提供
GFP\u NOFS
flag.

Hi-Roman。谢谢你的评论。所以你的意思是文件系统有一些全局互斥。一个文件系统调用kmalloc,如果kmalloc试图调用另一个filesystem函数,那么可能会出现死锁。如果有足够的页面,那么kmalloc将不会调用另一个文件系统函数,一切都会正常,对吗?那么你的意思是,文件系统有一些全局互斥对象-文件系统可以这样实现。这只是一个例子。如果有足够的页面,那么kmalloc将不会调用另一个文件系统函数——我认为,如果页面足够,kmalloc将不会调用文件系统函数,但是如果没有源代码,我就不能确定。GFP_NOFS标志用于不与文件系统交互,正如您所说的,可能会避免死锁。而对于递归文件系统调用,有什么问题吗?@dongdong看看我的例子。