[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 0gfp_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:- 分配内核使用的页
- 不能等待
- 允许异步回收页
- 不允许直接回收页