[TOC]
gfp_mask
Memory allocation flags
gfp_t
typedef unsigned __bitwise gfp_t;
gfp_mask 各个 bit 含义
include/linux/gfp.h
#define ___GFP_DMA 0x01u
#define ___GFP_HIGHMEM 0x02u
#define ___GFP_DMA32 0x04u
#define ___GFP_MOVABLE 0x08u
#define ___GFP_RECLAIMABLE 0x10u
#define ___GFP_HIGH 0x20u
#define ___GFP_IO 0x40u
#define ___GFP_FS 0x80u
#define ___GFP_WRITE 0x100u
#define ___GFP_NOWARN 0x200u
#define ___GFP_RETRY_MAYFAIL 0x400u
#define ___GFP_NOFAIL 0x800u
#define ___GFP_NORETRY 0x1000u
#define ___GFP_MEMALLOC 0x2000u
#define ___GFP_COMP 0x4000u
#define ___GFP_ZERO 0x8000u
#define ___GFP_NOMEMALLOC 0x10000u
#define ___GFP_HARDWALL 0x20000u
#define ___GFP_THISNODE 0x40000u
#define ___GFP_ATOMIC 0x80000u
#define ___GFP_ACCOUNT 0x100000u
#define ___GFP_DIRECT_RECLAIM 0x200000u
#define ___GFP_KSWAPD_RECLAIM 0x400000u
#ifdef CONFIG_LOCKDEP
#define ___GFP_NOLOCKDEP 0x800000u
#else
#define ___GFP_NOLOCKDEP 0
gfp_mask_2021-10-02-16.08.47.excalidraw
区域修饰符
指定从哪个区域类型分配页
__GFP_DMA
__GFP_HIGHMEM
__GFP_DMA32
__GFP_MOVABLE
页移动性和位置提示
__GFP_MOVABLE
:申请可移动页__GFP_RECLAIMABLE
:申请可回收页__GFP_WRITE
:指明调用者打算写物理页 只要有可能,把这些页分布到本地节点的所有区域,避免所有脏页在一个内存区域。__GFP_HARDWALL
:实施 puset 存分配策略 cpuset 是控制组 (cgroup) 的一个子系统,提供了把处理器和内存节点的集合分配给一组进程的机制,即允许进程在哪些处理器上运行和从哪些内存节点申请页。__GFP_THISNODE
:强制从指定节点分配页。__GFP_ACCOUNT
:把分配的页记账到内核内存控制组
水位线修饰符
__GFP_HIGH
:指明调用者是高优先级的,为了使系统能向前推进,必须准许这个请求。例如,创建一个 I/0 上下文,把脏页回写到存储设备,__GFP_ATOMIC
:指明调用者是高优先级的,不能回收页或者睡眠 典型的例子是中断处理程序__GFP_MEMALLOC
:允许访问所有内存。只能在调用者承诺“给我少量紧急保留内存使用,我可以释放更多的内存”的时候使用__GFP_NOMEMALLOC
: 禁止访问紧急保留内存 如果这个标志位和_GFP_MEMALLOC
同时被设置 优先级比后者高
回收修饰符
__GFP_IO
:允许读写存储设备__GFP_FS
:允许向下调用到底层文件系统 当文件系统申请页的时候,如果内存严重不足,直接回收页,把脏页回写到存储设备 调用文件系统的函数,可能导致死锁为了避免死锁 文件系统申请页的时候应该清除这个标志位__GFP_DIRECT_RECLAIM
:调用者可以直接回收页__GFP_KSWAPD_RECLAIM
:__GFP_RECLAIM
__GFP_REPEAT
__GFP_NOFAIL
__GFP_NORETRY
行动修饰符
__GFP_COLD
__GFP_NOWARN
__GFP_COMP
__GFP_ZERO
常见组合修饰符
标志符总是组合使用的,常见的标志位组合:
GFP_ATOMIC
:__GFP_HIGH | __GFP_ATOMIC | __GFP_KSWAPD_RECLAIM
- 原子分配
- 分配内核使用的页
- 不可睡眠
- 高优先级
- 允许异步回收页
GFP_KERNEL
:__GFP_RECLAIM | __GFP_IO | __GFP_FS
- 分配内核使用的页
- 可能睡眠
- 从低端内存区域回收页
- 允许异步回收页和直接回收页
- 允许读写存储设备
- 允许调用到底层文件系统
GFP_NOWAIT
:__GFP_KSWAPD_RECLAIM
:- 分配内核使用的页
- 不能等待
- 允许异步回收页
- 不允许直接回收页