首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

宋宝华:Linux内核中用GFP_ATOMIC申请内存究竟意味着什么?

本文目的 本文补充校正一些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个地方,其实都是可以睡眠的进程上下文

56130
您找到你想要的搜索结果了吗?
是的
没有找到

Linux 内核 内存管理】分区伙伴分配器 ② ( free_area 空闲区域结构体源码 | 分配标志位 | GFP_ZONE_TABLE 标志位区域类型映射表 |分配标志位对应的内存区域类型 )

-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

1.3K20

Linux 内核 内存管理】物理分配页 ⑦ ( __alloc_pages_slowpath 慢速路径调用函数源码分析 | 判断页阶数 | 读取 mems_allowed | 分配标志位转换 )

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

91020

Linux 内核 内存管理】物理分配页 ⑨ ( __alloc_pages_slowpath 慢速路径调用函数源码分析 | retry 标号代码分析 )

低水线分配 ; 如果上述 " 快速路径 " 分配失败 , 则执行 " 慢速路径 " 分配 ; 上述涉及到了 " 快速路径 " 和 " 慢速路径 " 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

67210

Linux 内核 内存管理】物理分配页 ① ( 分区伙伴分配器物理分配页核心函数 __alloc_pages_nodemask | __alloc_pages_nodemask 函数完整源码 )

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

30910

Linux 内核 内存管理】物理分配页 ⑧ ( __alloc_pages_slowpath 慢速路径调用函数源码分析 | 获取首选内存区域 | 异步回收内存页 | 最低水线也分配 | 直接分配 )

文章目录 一、获取首选内存区域 二、异步回收内存页 三、最低水线也分配 四、直接分配内存 在 【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

1.4K20

Linux 内核 内存管理】物理分配页 ⑤ ( get_page_from_freelist 快速路径调用函数源码分析 | 遍历备用区域列表 | 启用 cpuset 检查判定 | 判定脏页数量 )

文章目录 一、遍历备用区域列表 二、启用 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 相关标志位含义

87710

Linux 内核 内存管理】物理分配页 ② ( __alloc_pages_nodemask 函数参数分析 | __alloc_pages_nodemask 函数分配物理页流程 )

__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 分配标志位 参数 , 得到 " 内存节点 “ 的 首选 ” 区域类型 " 和 " 迁移类型 " ; 然后 , 执行 " 快速路径 " , 第一次分配 尝试使用 低水线分配 ; 如果上述

79020

Linux 内存分配流程及 kmalloc 解析

手把手教你分析 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 中关掉,只是在伙伴系统出现之前的临时使用

2.5K10

Linux 内核 内存管理】物理分配页 ⑥ ( get_page_from_freelist 快速路径调用函数源码分析 | 检查内存区域水线 | 判定节点回收 | 判定回收距离 | 回收分配页 )

函数参数分析 | __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);

72210

深入理解 Linux 物理内存分配全链路实现

前文回顾 在上篇文章 《深入理解 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 ___

48010
领券