diff --git a/study/kernel/00-DESCRIPTION/MEMORY_MANAGER.md b/study/kernel/00-DESCRIPTION/MEMORY_MANAGER.md
index a90a9e9..e9f1eb8 100755
--- a/study/kernel/00-DESCRIPTION/MEMORY_MANAGER.md
+++ b/study/kernel/00-DESCRIPTION/MEMORY_MANAGER.md
@@ -185,10 +185,16 @@
**关于 NUMA 支持:** Linux 内核中, 每个 zone 都有上述的链表数组, 从而提供精确到某个 node 的某个 zone 的伙伴分配需求.
+| 时间 | 作者 | 特性 | 描述 | 是否合入主线 | 链接 |
+|:----:|:----:|:---:|:----:|:---------:|:----:|
+| 2016/04/15 | Mel Gorman | [Remove zonelist cache and high-order watermark checking v4](https://lore.kernel.org/patchwork/cover/599755) | 优化调度器的路径, 减少对 rq->lock 的争抢, 实现 lockless. | v4 ☑ 4.4-rc1 | [PatchWork v6](https://lore.kernel.org/patchwork/cover/599755) |
+| 2016/04/15 | Mel Gorman | [Optimise page alloc/free fast paths v3](https://lore.kernel.org/patchwork/cover/668967) | 优化调度器的路径, 减少对 rq->lock 的争抢, 实现 lockless. | v3 ☑ 4.7-rc1 | [PatchWork v6](https://lore.kernel.org/patchwork/cover/668967) |
+| 2016/07/08 | Mel Gorman | [Move LRU page reclaim from zones to nodes v9](https://lore.kernel.org/patchwork/cover/696408) | 优化调度器的路径, 减少对 rq->lock 的争抢, 实现 lockless. | v3 ☑ 4.7-rc1 | [PatchWork v6](https://lore.kernel.org/patchwork/cover/696408) |
+
+
### 2.1.1.2 通过迁移类型分组来实现反碎片
-------
-
从2.6.32.25开始, linux在伙伴管理系统中引入迁移类型(migrate type)这么一个概念, 用于避免系统在长期运行过程中产生外碎片.
为什么要引入迁移类型. 我们都知道伙伴系统是针对于解决外碎片的问题而提出的, 那么为什么还要引入这样一个概念来避免碎片呢?
@@ -199,8 +205,17 @@
图中, 如果15对应的页是空闲的, 那么伙伴系统可以分配出连续的16个页框, 而由于15这一个页框被分配出去了, 导致最多只能分配出8个连续的页框. 假如这个页还会被回收回伙伴系统, 那么至少在这段时间内产生了碎片, 而如果更糟的, 如果这个页用来存储一些内核永久性的数据而不会被回收回来, 那么碎片将永远无法消除, 这意味着15这个页所处的最大内存块永远无法被连续的分配出去了. 假如上图中被分配出去的页都是不可移动的页, 那么就可以拿出一段内存, 专门用于分配不可移动页, 虽然在这段内存中有碎片, 但是避免了碎片散布到其他类型的内存中. 在系统中所有的内存都被标识为可移动的!也就是说一开始其他类型都没有属于自己的内存, 而当要分配这些类型的内存时, 就要从可移动类型的内存中夺取一部分过来, 这样可以根据实际情况来分配其他类型的内存.
+### 2.1.1.3 内存水线
+-------
-### 2.1.1.3 ALLOC_NOFRAGMENT 优化
+Linux 为每个 zone 都设置了独立的 min, low 和 high 三个档位的 watermark 值, 在代码中以struct zone中的 `_watermark[NR_WMARK]` 来表示.
+
+* 在进行内存分配的时候, 如果伙伴系统发现当前空余内存的值低于"low"但高于"min", 说明现在内存面临一定的压力, 但是并不是非常紧张, 那么在此次内存分配完成后, kswapd将被唤醒, 以执行内存回收操作. 在这种情况下, 内存分配虽然会触发内存回收, 但不存在被内存回收所阻塞的问题, 两者的执行关系是异步的.
+
+* 如果内存分配器发现空余内存的值低于了 "min", 说明现在内存严重不足. 那么这时候就有必要等待内存回收完成后, 再进行内存的分配了, 也就是 "direct reclaim". 但是这里面有个别特例, 内核提供了 PF_MEMALLOC 标记, 如果现在空余内存的大小可以满足本次内存分配的需求, 允许设置了 PF_MEMALLOC 标记的进程在内存紧张时, 先分配, 再回收. 比如 kswapd, 由于其本身就是负责回收内存的, 只需要满足它很小的需求, 它会回收大量的内存回来. 它就像公司濒临破产时抓到的一根救命稻草, 只需要小小的付出, 就会让公司起死回生.
+
+
+### 2.1.1.4 ALLOC_NOFRAGMENT 优化
-------
页面分配最容易出现的就是外碎片化问题, 因此主线进行了锲而不舍的优化, Mel Gorman 提出的 [Fragmentation avoidance improvements v5](https://lore.kernel.org/patchwork/cover/1016503) 是比较有特色的一组.
@@ -756,8 +771,16 @@ Linux 内核在脏页数量到达一定门槛时, 或者用户在命令行输入
用户态程序现在可以完成无修改就使用大页支持了. 用户还可以通过 **madvice()** 系统调用给予内核指示, 优化内核对大页的使用. 比如, 指示内核告知其你希望进程空间的某部分要使用大页支持, 内核会尽可能地满足你.
+# 2.8 进程虚拟地址空间
+-------
-# 2.8 内存控制组(Memory Cgroup)支持
+| 时间 | 作者 | 特性 | 描述 | 是否合入主线 | 链接 |
+|:----:|:----:|:---:|:----:|:---------:|:----:|
+| 2019/12/19 | Colin Cross | [mm: add a field to store names for private anonymous memory](https://lore.kernel.org/patchwork/cover/416962) | 在二进制中通过 xxx_sched_class 地址顺序标记调度类的优先级, 从而可以通过直接比较两个 xxx_sched_class 地址的方式, 优化调度器中两个热点函数 pick_next_task()和check_preempt_curr(). | v2 ☐ |[PatchWork RFC](https://lore.kernel.org/patchwork/cover/416962)
*-*-*-*-*-*-*-*
[PatchWork v2](https://lore.kernel.org/patchwork/cover/416962) |
+| 2019/12/19 | Steven Rostedt | [sched: Optimizations to sched_class processing](https://lore.kernel.org/patchwork/cover/1170901) | 对上面补丁的进一步优化, 对齐数据结构保证 cache 对齐, 通过链接脚本保证数据的排布顺序. | RFC ☑ 5.9-rc1 | [PatchWork](https://lore.kernel.org/patchwork/cover/1170901) |
+https://lore.kernel.org/patchwork/patch/416962/
+
+# 2.9 内存控制组(Memory Cgroup)支持
-------
@@ -771,7 +794,7 @@ Linux 内核在脏页数量到达一定门槛时, 或者用户在命令行输入
-# 2.9 内存热插拔支持
+# 2.10 内存热插拔支持
-------
@@ -802,7 +825,7 @@ Linux 内核在脏页数量到达一定门槛时, 或者用户在命令行输入
-## 2.9.1 内存热插入支持
+## 2.10.1 内存热插入支持
-------
**2.6.15(2006年1月发布)**
@@ -814,7 +837,7 @@ Linux 内核在脏页数量到达一定门槛时, 或者用户在命令行输入
-## 2.9.2 初步的内存逻辑热拔除支持
+## 2.10.2 初步的内存逻辑热拔除支持
-------
**2.6.24(2008年1月发布)**
@@ -832,7 +855,7 @@ Linux 内核在脏页数量到达一定门槛时, 或者用户在命令行输入
-## 2.9.3 完善的内存逻辑热拔除支持
+## 2.10.3 完善的内存逻辑热拔除支持
-------
**3.8(2013年2月发布)**
@@ -846,7 +869,7 @@ Linux 内核在脏页数量到达一定门槛时, 或者用户在命令行输入
-## 2.9.4 物理热拔除的支持
+## 2.10.4 物理热拔除的支持
-------
@@ -860,7 +883,7 @@ Linux 内核在脏页数量到达一定门槛时, 或者用户在命令行输入
-# 2.10 超然内存(Transcendent Memory)支持
+# 2.11 超然内存(Transcendent Memory)支持
-------
@@ -909,7 +932,7 @@ Linux 内核 从 3.X 系列开始陆续加入 tmem 相关的基础设施支持,
-## 2.10.1 前端接口之 CLEANCACHE
+## 2.11.1 前端接口之 CLEANCACHE
-------
**3.0(2011年7月发布)**
@@ -923,7 +946,7 @@ Linux 内核 从 3.X 系列开始陆续加入 tmem 相关的基础设施支持,
-## 2.10.2 前端接口之 FRONTSWAP
+## 2.11.2 前端接口之 FRONTSWAP
-------
**3.5(2012年7月发布)**
@@ -937,7 +960,7 @@ Linux 内核 从 3.X 系列开始陆续加入 tmem 相关的基础设施支持,
-## 2.10.3 后端之 ZCACHE
+## 2.11.3 后端之 ZCACHE
-------
@@ -947,7 +970,7 @@ Linux 内核 从 3.X 系列开始陆续加入 tmem 相关的基础设施支持,
-## 2.10.4后端之 ZRAM
+## 2.11.4 后端之 ZRAM
-------
**3.14(2014年3月发布)**
@@ -962,7 +985,7 @@ ZRAM 是一个在内存中的块设备(块设备相对于字符设备而言, 信
-## 2.10.5 后端之 ZSWAP
+## 2.11.5 后端之 ZSWAP
-------
**3.11(2013年9月发布)**
@@ -972,7 +995,7 @@ FRONTSWAP 对应的另一个后端叫 ZSWAP[35](#refer-anchor-35). ZS
-## 2.10.6 一些细节
+## 2.11.6 一些细节
-------
@@ -988,7 +1011,7 @@ FRONTSWAP 对应的另一个后端叫 ZSWAP[35](#refer-anchor-35). ZS
-# 2.11 非易失性内存 (NVDIMM, Non-Volatile DIMM) 支持
+# 2.12 非易失性内存 (NVDIMM, Non-Volatile DIMM) 支持
-------
@@ -1015,7 +1038,7 @@ FRONTSWAP 对应的另一个后端叫 ZSWAP[35](#refer-anchor-35). ZS
-## 2.11.1 NVDIMM 支持框架
+## 2.12.1 NVDIMM 支持框架
-------
** libnvdimm 4.2(2015年8月30日发布)**
@@ -1026,7 +1049,7 @@ FRONTSWAP 对应的另一个后端叫 ZSWAP[35](#refer-anchor-35). ZS
-## 2.11.2 DAX
+## 2.12.2 DAX
-------
@@ -1042,7 +1065,7 @@ FRONTSWAP 对应的另一个后端叫 ZSWAP[35](#refer-anchor-35). ZS
-# 2.12 内存管理调试支持
+# 2.13 内存管理调试支持
-------
@@ -1052,7 +1075,7 @@ FRONTSWAP 对应的另一个后端叫 ZSWAP[35](#refer-anchor-35). ZS
-## 2.12.1 页分配的调试支持
+## 2.13.1 页分配的调试支持
-------
@@ -1076,7 +1099,7 @@ FRONTSWAP 对应的另一个后端叫 ZSWAP[35](#refer-anchor-35). ZS
-## 2.12.2 SLAB 子系统的调试支持
+## 2.13.2 SLAB 子系统的调试支持
-------
@@ -1094,7 +1117,7 @@ SLAB 作为一个相对独立的子模块, 一直有自己完善的调试支持,
-## 2.12.3 错误注入机制
+## 2.13.3 错误注入机制
-------
**2.6.20(2007年2月发布)**
@@ -1104,7 +1127,7 @@ SLAB 作为一个相对独立的子模块, 一直有自己完善的调试支持,
-## 2.12.4 KMEMCHECK - 内存非法访问检测工具
+## 2.13.4 KMEMCHECK - 内存非法访问检测工具
-------
**2.6.31(2009年9月发布)**
@@ -1131,7 +1154,7 @@ SLAB 作为一个相对独立的子模块, 一直有自己完善的调试支持,
-## 2.12.4 KMEMLEAK - 内存泄漏检测工具
+## 2.13.4 KMEMLEAK - 内存泄漏检测工具
-------
**2.6.31(2009年9月发布)**
@@ -1158,7 +1181,7 @@ SLAB 作为一个相对独立的子模块, 一直有自己完善的调试支持,
-## 2.12.5 KASan - 内核地址净化器
+## 2.13.5 KASan - 内核地址净化器
-------
**4.0(2015年4月发布)**
@@ -1171,7 +1194,7 @@ SLAB 作为一个相对独立的子模块, 一直有自己完善的调试支持,
总的来说, 它利用了 GCC 5.0的新特性, 可对内核内存进行 Instrumentaion, 编译器可以在访问内存前插入指令, 从而检测该次访问是否合法. 对比前述的 KMEMCHECK 要用到 CPU 的陷阱指令处理和单步调试功能, KASan 是在编译时加入了探针, 因此它的性能更快.
-# 2.13 杂项
+# 2.14 杂项
-------
@@ -1179,7 +1202,7 @@ SLAB 作为一个相对独立的子模块, 一直有自己完善的调试支持,
-## 2.13.1 KSM - 内存去重
+## 2.14.1 KSM - 内存去重
-------
@@ -1197,7 +1220,7 @@ SLAB 作为一个相对独立的子模块, 一直有自己完善的调试支持,
-## 2.13.2 HWPoison - 内存页错误的处理
+## 2.14.2 HWPoison - 内存页错误的处理
-------
**2.6.32(2009年12月发布)**
@@ -1219,7 +1242,7 @@ SLAB 作为一个相对独立的子模块, 一直有自己完善的调试支持,
-## 2.13.3 Cross Memory Attach - 进程间快速消息传递
+## 2.14.3 Cross Memory Attach - 进程间快速消息传递
-------
**3.2(2012年1月发布)**