sys463 Asked: 2018-06-08 04:38:17 +0800 CST2018-06-08 04:38:17 +0800 CST 2018-06-08 04:38:17 +0800 CST 分配方式说明 772 我的系统报告了“页面分配失败”: [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. kernel memory 1 个回答 Voted Best Answer telcoM 2018-06-08T05:38:33+08:002018-06-08T05:38:33+08:00 标志似乎在文件中定义<kernel source directory>/include/linux/gfp.h,至少在内核 4.9.105 上,模式 0x2040d0 似乎映射到: GFP_NOTRACK | GFP_COMP | GFP_FS | GFP_IO | GFP_RECLAIMABLE 但是如果我用谷歌搜索标志定义,我会在某些来源中看到值 0x10 定义为 GFP_WAIT 而不是 GFP_RECLAIMABLE,这似乎与您的来源相匹配。 这个 LWN 讨论可能是有用的阅读,但我能看到的最好的描述是在include/linux/gfp.h文件的评论中。 通常,这些模式标志修改页面分配器的工作。 GFP_NOTRACK:避免使用kmemcheck. GFP_COMP:地址复合页面元数据 GFP_FS:表示分配器可以在必要时调用低级文件系统来回收页面;如果它被清除,我认为这将表明分配是针对某些可能持有锁的文件系统代码......例如,这在使用交换文件时可能很重要。 GFP_IO:表示分配器可以启动物理I/O回收页面来满足这个请求。 GFP_RECLAIMABLE:“[this] 用于指定 SLAB_RECLAIM_ACCOUNT 的 slab 分配,其页面可以通过收缩器释放。” 这个标志显然被文件系统的内存分配使用。基本上这似乎意味着有一个内核函数(收缩器)可以在必要时调用以释放或最小化此分配。
标志似乎在文件中定义
<kernel source directory>/include/linux/gfp.h
,至少在内核 4.9.105 上,模式 0x2040d0 似乎映射到:GFP_NOTRACK | GFP_COMP | GFP_FS | GFP_IO | GFP_RECLAIMABLE
但是如果我用谷歌搜索标志定义,我会在某些来源中看到值 0x10 定义为 GFP_WAIT 而不是 GFP_RECLAIMABLE,这似乎与您的来源相匹配。
这个 LWN 讨论可能是有用的阅读,但我能看到的最好的描述是在
include/linux/gfp.h
文件的评论中。通常,这些模式标志修改页面分配器的工作。
kmemcheck
.