本文目的 本文补充校正一些Linux内核开发者关于GFP_ATOMIC的认知不完整的地方,阐述GFP_ATOMIC与free内存watermark的关系,并明确什么时候应该用GFP_ATOMIC申请内存...GFP_KERNEL 内存水位,PF_MEMALLOC和GFP_ATOMIC 何时使用GFP_ATOMIC(一个patch分析) GFP_ATOMIC vs....Linux内核开发者关于GFP_ATOMIC的认知不完整的地方,阐述GFP_ATOMIC与free内存watermark的关系,并明确什么时候应该用GFP_ATOMIC申请内存。...\ (__GFP_RECLAIM | __GFP_IO | __GFP_FS) #define __GFP_RECLAIM \ ((__force gfp_t)(___GFP_DIRECT_RECLAIM...https://lore.kernel.org/linux-mm/1608894171-54174-2-git-send-email-tiantao6@hisilicon.com/ 上面2个地方,其实都是可以睡眠的进程上下文
本文目的 本文补充校正一些Linux内核开发者关于GFP_ATOMIC的认知不完整的地方,阐述GFP_ATOMIC与free内存watermark的关系,并明确什么时候应该用GFP_ATOMIC申请内存...GFP_ATOMIC vs. GFP_KERNEL 2. 内存水位,PF_MEMALLOC和GFP_ATOMIC 3....#define GFP_KERNEL \ (__GFP_RECLAIM | __GFP_IO | __GFP_FS) #define __GFP_RECLAIM \ ((__force...在Linux中,内存有3个水位: HIGH: 系统的free内存大于HIGH水位的时候,是一个相对保险的值,不需要急着做内存回收(reclaim); LOW: 系统的free内存达到LOW水位的时候,...发的RFC patch: https://lore.kernel.org/linux-mm/1608894171-54174-2-git-send-email-tiantao6@hisilicon.com
-4.12\include\linux\gfp.h#18 位置 ; /* Plain integer GFP bitmasks....0x04u #define ___GFP_MOVABLE 0x08u 源码路径 : linux-4.12\include\linux\gfp.h#18 三、GFP_ZONE_TABLE 标志位区域类型映射表...---- Linux 内核中 , 使用了 GFP_ZONE_TABLE 宏 , 定义了 " 标志位组合 " 与 " 区域类型 " 之间的映射 , GFP_ZONES_SHIFT 是 区域类型 对应的...)\ ) 四、分配标志位对应的内存区域类型 ---- 源码路径 : linux-4.12\include\linux\gfp.h#296 上述标志位对应的区域类型如下 : ___GFP_DMA 标志...-4.12\include\linux\gfp.h#296 内存区域类型 参考 【Linux 内核 内存管理】物理内存组织结构 ⑤ ( 内存区域 zone 类型简介 | 内存区域类型zone_type
alloc_pages_slowpath 慢速路径调用函数 二、判断页阶数 三、读取进程 mems_allowed 成员 四、分配标志位转换 五、__alloc_pages_slowpath 慢速路径调用完整函数源码 在 【Linux...分配 , 即 " 快速路径 " 内存分配失败 , 则执行 " 慢速路径 " 内存分配 ; " 慢速路径 " 内存分配 的核心函数 是 __alloc_pages_slowpath 函数 , 定义在 Linux...内核源码的 linux-4.12\mm\page_alloc.c#3676 位置 ; 源码路径 : linux-4.12\mm\page_alloc.c#3676 二、判断页阶数 ---- 先判断...(gfp_mask & __GFP_NOWARN)); return NULL; } 源码路径 : linux-4.12\mm\page_alloc.c#3699 三、读取进程 mems_allowed...So we do that now. */ alloc_flags = gfp_to_alloc_flags(gfp_mask); 源码路径 : linux-4.12\mm\page_alloc.c
低水线分配 ; 如果上述 " 快速路径 " 分配失败 , 则执行 " 慢速路径 " 分配 ; 上述涉及到了 " 快速路径 " 和 " 慢速路径 " 2 种物理页分配方式 ; 继续接着上一篇博客 【Linux...& __GFP_KSWAPD_RECLAIM) wake_all_kswapds(order, ac); 源码路径 : linux-4.12\mm\page_alloc.c#3794 调用 get_page_from_freelist...& __GFP_NORETRY) goto nopage; 源码路径 : linux-4.12\mm\page_alloc.c#3845 如果 申请 物理页 阶数 大于 0 , 则调用 should_compact_retry...& __GFP_NOMEMALLOC))) goto nopage; 源码路径 : linux-4.12\mm\page_alloc.c#3884 内存耗尽杀手 取得一定进展 , 继续跳转到 retry...(gfp_mask & __GFP_REPEAT)) goto nopage; if (should_reclaim_retry(gfp_mask, order, ac, alloc_flags
v=4.7, line 46 tools/virtio/linux/kernel.h?v=4.7, line 52 tools/virtio/linux/kernel.h?..., 相对而言每一个宏又被重新定义如下, 参见include/linux/gfp.h?...称之为类型标志, 定义在include/linux/gfp.h?...那么内存分配可以从该内存域或更低的内存域进行, 该函数定义在include/linux/gfp.h?...的定义如下, 在include/linux/gfp.h?
alloc_pages_nodemask 二、__alloc_pages_nodemask 函数完整源码 一、分区伙伴分配器物理分配页核心函数 __alloc_pages_nodemask ---- Linux...物理页分配函数 , 所有的 函数 都会调用 __alloc_pages_nodemask 函数 , 该函数是 物理页分配 的 核心函数 ; __alloc_pages_nodemask 函数 定义在 Linux...内核源码的 linux-4.12\mm\page_alloc.c#4003 位置 , 函数原型如下 : /* * This is the 'heart' of the zoned buddy allocator..., nodemask_t *nodemask) 源码路径 : linux-4.12\mm\page_alloc.c#4003 二、__alloc_pages_nodemask 函数完整源码 ----...); trace_mm_page_alloc(page, order, alloc_mask, ac.migratetype); return page; } 源码路径 : linux-4.12
/gfp.h, line 466 UMA-include/linux/gfp.h?.../linux/gfp.h?.../linux/gfp.h?.../include/linux/gfp.h?.../source/include/linux/gfp.h?
文章目录 一、获取首选内存区域 二、异步回收内存页 三、最低水线也分配 四、直接分配内存 在 【Linux 内核 内存管理】物理分配页 ② ( __alloc_pages_nodemask 函数参数分析...| __alloc_pages_nodemask 函数分配物理页流程 ) 博客中 , 分析了 __alloc_pages_nodemask 函数分配物理页流程如下 : 首先 , 根据 gfp_t gfp_mask...低水线分配 ; 如果上述 " 快速路径 " 分配失败 , 则执行 " 慢速路径 " 分配 ; 上述涉及到了 " 快速路径 " 和 " 慢速路径 " 2 种物理页分配方式 ; 继续接着上一篇博客 【Linux...ac->preferred_zoneref->zone) goto nopage; 源码路径 : linux-4.12\mm\page_alloc.c#3731 二、异步回收内存页 ---- 调用...gfp_pfmemalloc_allowed(gfp_mask)) { page = __alloc_pages_direct_compact(gfp_mask, order, alloc_flags
/gfp.h, line 466 UMA-include/linux/gfp.h?...v=4.7, line 476 alloc_page(mask) 是前者在order = 0情况下的简化形式,只分配一页 include/linux/gfp.h?..., order) 用来获得适用于DMA的页. include/linux/gfp.h?.../include/linux/gfp.h?.../source/include/linux/gfp.h?
文章目录 一、遍历备用区域列表 二、启用 cpuset 检查判定 三、判定内存节点的脏页数量 在 【Linux 内核 内存管理】物理分配页 ② ( __alloc_pages_nodemask 函数参数分析...| __alloc_pages_nodemask 函数分配物理页流程 ) 博客中 , 分析了 __alloc_pages_nodemask 函数分配物理页流程如下 : 首先 , 根据 gfp_t gfp_mask...( __alloc_pages_nodemask 函数源码分析 | 快速路径 | 慢速路径 | get_page_from_freelist 源码 ) 博客中 , 介绍了 快速路径 主要调用 定义在 Linux...内核源码的 linux-4.12\mm\page_alloc.c#3017 位置的 get_page_from_freelist 函数 , 分配物理页内存 ; 一、遍历备用区域列表 ---- 在 函数中...__cpuset_zone_allowed(zone, gfp_mask)) continue; } } 源码路径 : linux-4.12\mm\page_alloc.c#3034 相关标志位含义
文章目录 一、__alloc_pages_nodemask 函数源码分析 ( 快速路径 | 慢速路径 ) 二、get_page_from_freelist 快速路径 调用函数 完整源码 在 【Linux...get_page_from_freelist(alloc_mask, order, alloc_flags, &ac); if (likely(page)) goto out; 源码路径 : linux...& __GFP_ACCOUNT) && page && unlikely(memcg_kmem_charge(page, gfp_mask, order) !...); trace_mm_page_alloc(page, order, alloc_mask, ac.migratetype); return page; 源码路径 : linux-4.12\mm...to allocate * a page. */ static struct page * get_page_from_freelist(gfp_t gfp_mask, unsigned int
变更履历 内核版本4.5.0支持arm64undefinedhttps://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit.../linux.git/commit/?.../linux.git/commit/?...gfp_mask = GFP_KERNEL; void *p; /* Silence the initial allocation */ if (IS_ENABLED(CONFIG_ARM_MODULE_PLTS...)) gfp_mask |= __GFP_NOWARN; p = __vmalloc_node_range(size, 1, MODULES_VADDR, MODULES_END,
__alloc_pages_nodemask 函数分配物理页流程 一、__alloc_pages_nodemask 函数参数分析 ---- __alloc_pages_nodemask 函数 定义在 Linux...内核源码的 linux-4.12\mm\page_alloc.c#4003 位置 , 函数原型如下 : ① gfp_t gfp_mask 参数 表示 物理页 " 分配标志位 " ; ② unsigned...; /* * This is the 'heart' of the zoned buddy allocator. */ struct page * __alloc_pages_nodemask(gfp_t...gfp_mask, unsigned int order, struct zonelist *zonelist, nodemask_t *nodemask) 源码路径 : linux-4.12\...gfp_mask 分配标志位 参数 , 得到 " 内存节点 “ 的 首选 ” 区域类型 " 和 " 迁移类型 " ; 然后 , 执行 " 快速路径 " , 第一次分配 尝试使用 低水线分配 ; 如果上述
手把手教你分析 Linux 启动流程 上一次咱们分析了 Linux 的启动流程和初始化流程,今天主要分析一下内存方面的初始化和常见的内存分配方式。...start_kernel |--->mm_init |--->mem_init linux4.14/init/main.c 在 mem_init 函数中会初始化伙伴系统和 slab...在 kmalloc 的使用过程中,常用标志位:GFP_KERNEL、GFP_ATOMIC、GFP_USER、GFP_HIGHUSER、GFP_NOIO、GFP_NOFS。...前两个最常用,GFP_KERNEL 代表在使用 kmalloc 分配内存时,如果内存准备不足,会等待,也就是会睡眠。...2、有的人可能知道 Linux 有一个 bootmem 分配器,这个是在Linux初始化过程中的一个临时分配器,他会在 setup_arch 函数中初始化,然后在 mm_init 中关掉,只是在伙伴系统出现之前的临时使用
前文回顾 在上篇文章 《深入理解 Linux 物理内存管理》中,笔者详细的为大家介绍了 Linux 内核如何对物理内存进行管理以及相关的一些内核数据结构。...大家跟着笔者的节奏继续往下看~~~ 2.规范物理内存分配行为的掩码 gfp_mask 笔者在 《深入理解 Linux 物理内存管理》一文中的 “ 4.3 NUMA 节点物理内存区域的划分 ” 小节中曾经为大家详细的介绍了...image.png gfp_mask 掩码中这些区域修饰符 zone modifiers 定义在内核 /include/linux/gfp.h 文件中: #define ___GFP_DMA...接下来的内容笔者就为大家揭晓~~~ 内核在 /include/linux/gfp.h 文件中定义了一个叫做 gfp_zone 的函数,这个函数用于将我们在物理内存分配接口中指定的 gfp_mask 掩码转换为物理内存区域...让我们接着往下看~~~ 这些内存分配行为修饰符同样也是定义在 /include/linux/gfp.h 文件中: #define ___GFP_RECLAIMABLE 0x10u #define ___
函数参数分析 | __alloc_pages_nodemask 函数分配物理页流程 ) 博客中 , 分析了 __alloc_pages_nodemask 函数分配物理页流程如下 : 首先 , 根据 gfp_t...gfp_mask 分配标志位 参数 , 得到 " 内存节点 “ 的 首选 ” 区域类型 " 和 " 迁移类型 " ; 然后 , 执行 " 快速路径 " , 第一次分配 尝试使用 低水线分配 ; 如果上述...内核源码的 linux-4.12\mm\page_alloc.c#3017 位置的 get_page_from_freelist 函数 , 分配物理页内存 ; 接着 【Linux 内核 内存管理】物理分配页..., 则 不能从该 " 内存区域 " 分配 物理页 , continue 中断本次循环 , 继续遍历其它 内存区域 ; ret = node_reclaim(zone->zone_pgdat, gfp_mask..., alloc_flags, ac->migratetype); if (page) { prep_new_page(page, order, gfp_mask, alloc_flags);
包括就可以使用page,其实际定义在 struct page{ page_flags_t flags; atomic_t _count;...a.分配 #include 1. struct page * alloc_pages( unsigned int gfp_mask, unsigned int...int gfp_mask); //只分配一页 b.gfp_mask标志 这个标志决定了内核在分配内存时的行为,以及从哪里分配内存。...#include #define GFP_ATOMIC //原子分配,不会休眠,可用于中断处理。...这实际上是一种对象高速缓存(缓存对象). linux针对这种要求提供了一个slab分配器来完成这一工作。
很长时间以来,物理内存的碎片确实是Linux的弱点之一。尽管已经提出了许多方法,但没有哪个方法能够既满足Linux需要处理的各种类型工作负荷提出的苛刻需求,同时又对其他事务影响不大。...辅助函数gfpflags_to_migratetype可用于转换分配标志及对应的迁移类型, 该函数定义在include/linux/gfp.h?...= ___GFP_MOVABLE); BUILD_BUG_ON((___GFP_MOVABLE >> GFP_MOVABLE_SHIFT) !...& GFP_MOVABLE_MASK) >> GFP_MOVABLE_SHIFT; } linux-2.6.x的内核中转换分配标志及对应的迁移类型的辅助函数为allocflags_to_migratetype...参见include/linux/mmzone.h?
领取专属 10元无门槛券
手把手带您无忧上云