我的系统报告了“页面分配失败”:
[some_app]: page allocation failure: order:4, mode:0x2040d0
有人可以解释一下该模式到底代表什么吗?我说得对吗,这是针对以下 GFP 标志的:GFP_NOTRACK | GFP_COMP | GFP_WAIT | GFP_IO | GFP_FS
?
内核版本是3.10.0-693.21.1.el7.AV1.x86_64
.
答案1
这些标志似乎是在 file 中定义的<kernel source directory>/include/linux/gfp.h
,至少在内核 4.9.105 上,模式 0x2040d0 似乎映射到:
GFP_NOTRACK | GFP_COMP | GFP_FS | GFP_IO | GFP_RECLAIMABLE
但是,如果我 Google 查找标志定义,我会在某些源中看到值 0x10 定义为 GFP_WAIT 而不是 GFP_RECLAIMABLE,这似乎与您的源匹配。
这次 LWN 讨论可能是有用的阅读,但我能看到的最好的描述是在文件的注释中include/linux/gfp.h
。
一般来说,这些模式标志会修改页面分配器的工作。
- GFP_NOTRACK:避免使用
kmemcheck
. - GFP_COMP:地址复合页元数据
- GFP_FS:表示分配器可以在必要时调用低级文件系统来回收页面;如果清除此选项,我认为这表明分配是针对某些可能持有锁的文件系统代码...例如,这在使用交换文件时可能很重要。
- GFP_IO:表示分配器可以启动物理I/O来回收页面以满足此请求。
- GFP_RECLAIMABLE:“[此]用于指定 SLAB_RECLAIM_ACCOUNT 的slab分配,并且其页面可以通过收缩器释放。”该标志显然是由文件系统的内存分配使用的。基本上,这似乎意味着有一个内核函数(收缩器)可以在必要时调用来释放或最小化此分配。