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

Reference