From a5535cbb75cd0c6e45c1012a52017439ffc33853 Mon Sep 17 00:00:00 2001 From: Cheng Jian Date: Sun, 16 Jan 2022 13:31:24 +0800 Subject: [PATCH] description/memory: HugeTLB Migration --- study/kernel/00-DESCRIPTION/MEMORY_MANAGER.md | 31 ++++++++++++++++--- 1 file changed, 27 insertions(+), 4 deletions(-) diff --git a/study/kernel/00-DESCRIPTION/MEMORY_MANAGER.md b/study/kernel/00-DESCRIPTION/MEMORY_MANAGER.md index de8dc6c..d3da21a 100644 --- a/study/kernel/00-DESCRIPTION/MEMORY_MANAGER.md +++ b/study/kernel/00-DESCRIPTION/MEMORY_MANAGER.md @@ -147,6 +147,7 @@ cgit 上查看 MM 所有的 log 信息 : | [Joonsoo Kim](https://lore.kernel.org/patchwork/project/lkml/list/?submitter=13703&state=%2A&archive=both) | NA | | [Kamezawa Hiroyuki ](https://lore.kernel.org/patchwork/project/lkml/list/?submitter=4430&state=%2A&archive=both) | NA | | [Kirill A. Shutemov ](https://lore.kernel.org/patchwork/project/lkml/list/?submitter=13419&state=%2A&archive=both) | [git.kernel.org](https://git.kernel.org/pub/scm/linux/kernel/git/kas/linux.git) +| [Naoya Horiguchi ](https://github.com/nhoriguchi/linux) | [github/nhoriguchi/linu](https://github.com/nhoriguchi/linux) | ## 0.6 社区地址 ------- @@ -2431,17 +2432,38 @@ huge page 最开始只支持 PMD 级别(基础页 4K, 则 PMD 级别为 2MB)的 | 2020/02/11 | Mina Almasry | [hugetlb_cgroup: Add hugetlb_cgroup reservation limits](https://lore.kernel.org/linux-mm/cover.1632843268.git.baolin.wang@linux.alibaba.com) | 当前, 在 hugetlb cgroup 中, 任务的统计信息不会在任务迁移时转移到新的 hugetlb cgroup 中, 这个补丁集增加了 hugetlb cgroup 计费统计迁移. | v1 ☐ | 2019/08/08 [PatchWork RFC](https://patchwork.kernel.org/project/linux-mm/patch/20190808194002.226688-1-almasrymina@google.com)
*-*-*-*-*-*-*-*
2019/08/08 [PatchWork RFC,v2,0/5](https://patchwork.kernel.org/project/linux-mm/cover/20190808231340.53601-1-almasrymina@google.com)
*-*-*-*-*-*-*-*
[PatchWork v3,0/6](https://patchwork.kernel.org/project/linux-mm/cover/20190826233240.11524-1-almasrymina@google.com)
*-*-*-*-*-*-*-*
[PatchWork v5,0/7](https://patchwork.kernel.org/project/linux-mm/cover/20190919222421.27408-1-almasrymina@google.com)
*-*-*-*-*-*-*-*
[PatchWork v6,1/9](https://patchwork.kernel.org/project/linux-mm/patch/20191013003024.215429-1-almasrymina@google.com)
*-*-*-*-*-*-*-*
[PatchWork v12,1/9](https://patchwork.kernel.org/project/linux-mm/patch/20200211213128.73302-1-almasrymina@google.com) | -### 7.1.6 HugeTLB reserve & allocations +### 7.1.6 HugeTLB Migration +------- + + +| 时间 | 作者 | 特性 | 描述 | 是否合入主线 | 链接 | +|:----:|:----:|:---:|:----:|:---------:|:----:| +| 2010/08/10 | Naoya Horiguchi | [Hugepage migration](https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/log/?id=86cdb465cf3a9d81058b517af05074157fa9dcdd) | 实现 hugepage 迁移.
1. 将 hugepage 迁移函数与原始迁移代码分开, 这是为了避免复杂性.
2. 在当前版本中, 定义了一些高级迁移例程来处理 hugepage, 但同时一些基础的辅助函数与原始迁移代码共享, 以避免增加重复.
HWPOISION 的部分参见 [HWPOISON for hugepage](https://lwn.net/Articles/387568). | v2 ☑ 2.6.37 | [LORE v2,0/9](https://lore.kernel.org/lkml/1281432464-14833-1-git-send-email-n-horiguchi@ah.jp.nec.com), [关键 COMMIT](https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=290408d4a25002f099efeee7b6a5778d431154d6) | +| 2013/09/11 | Michal Hocko | [extend hugepage migration](https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/log/?id=86cdb465cf3a9d81058b517af05074157fa9dcdd) | 一步扩展 Hugepage 迁移.
HugePage 迁移现在仅适用于软脱机 soft offlining(将半损坏页面上的数据移动到另一个页面以保存数据). 但是它对页面迁移的其他用户也很有用, 所以这个补丁集试图扩展一些这样的用户以支持 hugepage.
这个补丁集并没有在内存压缩中扩展页面迁移, 因为我认为内存压缩的用户主要希望通过安排原始页面来构建 thp, 但 hugepage 迁移并没有帮助.
页面迁移的另一个用户 CMA 可以从 hugepage 迁移中获益, 但现在还未支持它.
目前还没有启用 1GB Hugepage 的 Hugepage 迁移, 因为作者不确定 1GB Hugepage 的用户是否真的需要它. | v5 ☑ 3.12-rc1 | [LORE RFC,0/9](https://lore.kernel.org/lkml/1361475708-25991-1-git-send-email-n-horiguchi@ah.jp.nec.coms)
*-*-*-*-*-*-*-*
[LORE v3,0/8](https://lore.kernel.org/lkml/1374183272-10153-1-git-send-email-n-horiguchi@ah.jp.nec.com), [LKML v3,0/8](https://lkml.org/lkml/2013/7/18/542)
*-*-*-*-*-*-*-*
[LORE v4,0/8](https://lore.kernel.org/lkml/1374728103-17468-1-git-send-email-n-horiguchi@ah.jp.nec.com)
*-*-*-*-*-*-*-*
[LKML v5,0/8](https://lkml.org/lkml/2013/8/9/21)
*-*-*-*-*-*-*-*
[COMMIT](https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=86cdb465cf3a9d81058b517af05074157fa9dcdd) | + + +### 7.1.7 HugeTLB reserve & allocations ------- * HugeTLB from ZONE_MOVABLE -允许在 ZONE_MOVABLE 上进行 hugetlb 的分配. +[commit 396faf0303d2 ("Allow huge page allocations to use GFP_HIGH_MOVABLE")](https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=396faf0303d273219db5d7eb4a2879ad977ed185) 允许在 ZONE_MOVABLE 上进行 hugetlb 的分配. HugeTLB 的页面通常是不能移动的, 所以不会从 ZONE_MOVABLE 中分配. 然而, 由于 ZONE_MOVABLE 区总是有可以迁移或回收的页面, 因此即使系统已经运行了很长时间, 它也有足够的连续内存可以用来满足大页的分配. 因此这允许管理员在运行时根据 ZONE_MOVABLE 的大小调整巨大页面池的大小。 + +这个补丁添加了一个名为 [hugepages_treat_as_movable](https://elixir.bootlin.com/linux/v2.6.23/source/kernel/sysctl.c#L895) 的新 sysctl. 使能(该接口写入 1)后将来对这个 HugeTLB 内存池的分配将从 ZONE_MOVABLE 区域分配. 这是通过将 HugeTLB 的页面分配 flag 从默认的 GFP_HIGHUSER 修改为 GFP_HIGHUSER_MOVABLE 来完成的. 尽管大页是不可移动的, 但我们不会引入额外的外部内存碎片, 因为大页正是我们所关心的最大的连续内存块分配需求. | 时间 | 作者 | 特性 | 描述 | 是否合入主线 | 链接 | |:----:|:----:|:---:|:----:|:---------:|:----:| | 2007/07/17 | Mel Gorman | [Allow huge page allocations to use GFP_HIGH_MOVABLE](https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=396faf0303d273219db5d7eb4a2879ad977ed185) | 提供了一个 [sysctl hugepages_treat_as_movable](https://elixir.bootlin.com/linux/v2.6.23/source/mm/hugetlb.c#L31), 允许在 ZONE_MOVABLE 上进行 hugetlb 的分配. 这意味着, 如果页面没有被 mlock 锁定, 那么在系统的生命周期内, 可以将 hugetlb 的页面池调整为 ZONE_MOVABLE 的大小(huge page pool 的尺寸包含了 ZONE_MOVABLE 的尺寸). 尽管大页是不可移动的, 但是内核开发者们认为这不会引入额外的外部内存碎片, 因为大页不正是我们所关心的最大的连续块的分配请求么. | v1 ☑ 2.6.23 | [COMMIT](https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=396faf0303d273219db5d7eb4a2879ad977ed185) | +hugepages_treat_as_movable 的目的是减少内存碎片, 而 hugetlb 页面的寿命一般都很长, 且范围足够大, 因此不会造成碎片, 所以在当时使用这个区域是可以接受的. 但是随着内核不断的发展情况发生了变化, 这个 ZONE_MOVABLE 区域的主要目的变成了保证可迁移性, 从而能够很好的支持虚拟机内存的热插拔. 如果我们允许不可迁移的 hugetlb 页面在 ZONE_MOVABLE 内存中, 热插拔失败的机会会很高. 因此不太合适用一个单独的 sysctl hugepages_treat_as_movable 来控制 HugeTLB 从 ZONE_MOVABLE 中分配. 更合理的方式应该是去看当前是否支持 [HugeTLB 的迁移](). 内核引入了 hugepage_migration_support(ed) 函数来检查这个功能. + +在 [extend hugepage migration](https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/log/?id=86cdb465cf3a9d81058b517af05074157fa9dcdd) 之时, 内核完成了支持 HugeTLB 页面的迁移大部分工作, 已经[准备好了移除 hugepages_treat_as_movable](https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=86cdb465cf3a9d81058b517af05074157fa9dcdd). 因此后面直接[移除了 hugepages_treat_as_movable](https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=d6cb41cc44c63492702281b1d329955ca767d399), 只要内核支持 hugepage_migration_support(ed) 允许对 HugeTLB 的页面进行迁移, 就可以支持从 ZONE_MOVABLE 中迁移. + +| 时间 | 作者 | 特性 | 描述 | 是否合入主线 | 链接 | +|:----:|:----:|:---:|:----:|:---------:|:----:| +| 2018/01/31 | Michal Hocko | [mm, hugetlb: remove hugepages_treat_as_movable sysctl](https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/log/?id=944d9fec8d7aee3f2e16573e9b6a16634b33f403) | 移除 hugepages_treat_as_movable, 不再允许 HugeTLB 从 ZONE_MOVABLE 中分配. 而是[使用 hugepage_migration_support(ed) 来做控制](https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=83467efbdb7948146581a56cbd683a22a0684bbb). | RFC ☑ 4.16-rc1 | [LORE RFC](https://lore.kernel.org/all/20171003072619.8654-1-mhocko@kernel.org), [COMMIT](https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=d6cb41cc44c63492702281b1d329955ca767d399) | + + * HugeTLB CMA 其次是允许从 CMA 区域中分配 hugetlb, 以及 NUMA Aware 的初步尝试 @@ -2478,7 +2500,8 @@ HugeTLB 预留空间时可以精细化控制不同 NUMA NODE 上预留的空间. | 2021/10/15 | Baolin Wang | [hugetlb: Support node specified when using cma for gigantic hugepages](https://patchwork.kernel.org/project/linux-mm/patch/bb790775ca60bb8f4b26956bb3f6988f74e075c7.1634261144.git.baolin.wang@linux.alibaba.com) | 所有在线节点的 hugepages 运行时分配的 CMA 区域大小是平衡的, 但我们还希望指定每个节点的 CMA 大小, 或者在某些情况下仅指定一个节点, 这与 [hugetlb 的分 numa 节点指定大小](https://patchwork.kernel.org/project/linux-mm/patch/20211005054729.86457-1-yaozhenguo1@gmail.com)类似. | v3 ☐ | [2021/10/10 PatchWork v1](https://patchwork.kernel.org/project/linux-mm/patch/bb790775ca60bb8f4b26956bb3f6988f74e075c7.1634261144.git.baolin.wang@linux.alibaba.com)
*-*-*-*-*-*-*-*
[2021/10/15 PatchWork v3](https://patchwork.kernel.org/project/linux-mm/patch/bb790775ca60bb8f4b26956bb3f6988f74e075c7.1634261144.git.baolin.wang@linux.alibaba.com) | | 2021/11/17 | Mina Almasry | [hugetlb: Add `hugetlb.*.numa_stat` file](https://patchwork.kernel.org/project/linux-mm/patch/20211019215437.2348421-1-almasrymina@google.com) | 添加 `hugetlb.*.numa_stat`, 它显示 hugetlb 在 cgroup 的 numa 使用信息. 类似于 memory.numa_stat. | v7 ☐ | [PatchWork v1](https://patchwork.kernel.org/project/linux-mm/patch/20211019215437.2348421-1-almasrymina@google.com)
*-*-*-*-*-*-*-*
[PatchWork v2](https://patchwork.kernel.org/project/linux-mm/patch/20211020190952.2658759-1-almasrymina@google.com)
*-*-*-*-*-*-*-*
[PatchWork v7](https://patchwork.kernel.org/project/linux-mm/patch/20211117201825.429650-1-almasrymina@google.com) | -### 7.1.7 More HugeTLB Patchset + +### 7.1.x More HugeTLB Patchset ------- @@ -2486,7 +2509,7 @@ HugeTLB 预留空间时可以精细化控制不同 NUMA NODE 上预留的空间. |:----:|:----:|:---:|:----:|:---------:|:----:| | 2020/12/22 | Liang Li | [add support for free hugepage reporting](https://lore.kernel.org/patchwork/cover/1355899) | Free page reporting 只支持伙伴系统中的页面, 它不能报告为 hugetlbfs 预留的页面. 这个补丁在 hugetlb 的空闲列表中增加了对报告巨大页的支持, 它可以被 virtio_balloon 驱动程序用于内存过载和预归零空闲页, 以加速内存填充和页面错误处理. | RFC ☐ | [PatchWork RFC,0/3](https://patchwork.kernel.org/project/linux-mm/cover/20201222074538.GA30029@open-light-1.localdomain) | | 2021/10/07 | Mike Kravetz | [hugetlb: add demote/split page functionality](https://lore.kernel.org/patchwork/cover/1465517) | 实现了 hugetlb 降低策略. 提供了一种"就地"将 hugetlb 页面分割为较小的页面的方法. | v4 ☐ | [2021/07/21 PatchWork 0/8](https://patchwork.kernel.org/project/linux-mm/cover/20210721230511.201823-1-mike.kravetz@oracle.com)
*-*-*-*-*-*-*-*
[2021/08/16 PatchWork RESEND,0/8](https://patchwork.kernel.org/project/linux-mm/cover/20210816224953.157796-1-mike.kravetz@oracle.com)
*-*-*-*-*-*-*-*
[2021/09/23 PatchWork v2,0/4](https://patchwork.kernel.org/project/linux-mm/cover/20210923175347.10727-1-mike.kravetz@oracle.com)
*-*-*-*-*-*-*-*
[2021/10/07 PatchWork v4,0/5](https://patchwork.kernel.org/project/linux-mm/cover/20211007181918.136982-1-mike.kravetz@oracle.com) | -| 2021/10/14 | Mina Almasry | [mm, hugepages: add mremap() support for hugepage backed vma](https://patchwork.kernel.org/project/linux-mm/patch/20210730221522.524256-1-almasrymina@google.com) | 通过简单地重新定位页表项, 使得 mremap() 支持 hugepage 的 vma 段. 页表条目被重新定位到 mremap() 上的新虚拟地址.
作者验证的测试场景是一个简单的 bench: 它在 hugepages 中重新加载可执行文件的 ELF 文本, 这大大提高了上述可执行文件的执行性能.
将 hugepages 上的 mremap 操作限制为原始映射的大小, 因为底层 hugetlb 保留还不能处理到更大的大小的重映射.
在 mremap () 操作期间, 我们检测 pmd_shared 的映射, 并在 mremap () 期间取消这些映射的共享. 在访问和故障时, 再次建立共享. | v1 ☐ | [PatchWork v1](https://patchwork.kernel.org/project/linux-mm/patch/20210730221522.524256-1-almasrymina@google.com)
*-*-*-*-*-*-*-*
[PatchWork v4,1/2](https://patchwork.kernel.org/project/linux-mm/patch/20211006194515.423539-1-almasrymina@google.com)
*-*-*-*-*-*-*-*
[PatchWork v8,1/2](https://patchwork.kernel.org/project/linux-mm/patch/20211014200542.4126947-1-almasrymina@google.com) | +