v7
2026-11-12
修复MGLRU swappiness行为 · v7
重构 MGLRU 代际回收,调整可回收量统计、最老代选择和扫描预算平衡。
原始补丁链接
子 Patch(16)
1/16
mm/mglru: report evictable sizes per type
将 lruvec_evictable_size() 改为分别返回匿名页与文件页可回收量,并相应更新 lruvec_is_sizable()、get_nr_to_scan() 的求和用法;总量不变,为后续按类型权衡扫描预算铺路。
2/16
mm/mglru: extract lruvec_populated_min_seq() helper
从 try_to_inc_min_seq() 抽出 lruvec_populated_min_seq(),按给定 max_seq 上界查找某类型最老的非空 generation;仅供后续复用,无功能变化。
3/16
mm/mglru: reclaim from the oldest populated gen
当默认优先级无法满足回收时,MGLRU 从实际有 folio 的最老 generation 回收,而非死扫空 gen;保留 gen 布局以维持 hotness 与 swappiness 语义。
4/16
mm/mglru: lift the forced protection of reclaimer
去掉 get_nr_gens()==MIN_NR_GENS 时提前放弃回收的限制,使高优先级扫描可触及 max_seq;映射页仍由 rmap PTE 检查保护,避免高压 OOM。
5/16
mm/mglru: skip zones above reclaim_idx instead of rotating them
让 lruvec_populated_min_seq() 与 scan_folios() 仅考虑 reclaim_idx 以下可回收 zone,删除 sort_folio() 的 ineligible 轮转分支,避免无效扫描与 aging。
6/16
mm/mglru: return for unavailable anon reclaim earlier
重排 MGLRU 中匿名页不可回收情形的返回路径,使不可用 anon 回收更早退出;仅为后续按 swappiness 分配扫描预算做代码整理,无功能变化。
7/16
mm/mglru: balance anon and file scan budget by refault rate
用 lru_gen_balance_scan() 按 swappiness、两类 refault rate 与权重比例拆分扫描预算,每轮同时扫描 anon/file,取代 get_type_to_scan()/isolate_folios() 的单类型批量选择。
8/16
mm/mglru: lift youngest gen protection for higher priority
在高回收优先级下放宽 MGLRU 对最年轻 generation 的强制保护,允许扫描到 max_seq,缓解 aging 跟不上并发回收导致的提前 OOM,同时保留默认优先级热度保护。
9/16
mm/mglru: Avoid placing rejected folios below populated gen
向 move_folios_to_lru() 传入 scanned_seq,使被拒绝 folio 提升或放入最年轻 gen,避免落入已扫描的 populated gen 导致反复扫描、降低 pg_steal/pg_scan。
10/16
mm/mglru: Run aging when pages are rare outside the youngest gen
当两类最年轻 gen 外页数低于其 1/MAX_NR_GENS 时触发 aging,极端 swappiness 再考虑类型平衡;仅低优先级启用,提高回收效率并减少系统时间。
11/16
mm/mglru: Run aging when one type has no populatable folios
某类型仍有扫描预算但可扫描 generation 无 folio 时触发 aging,避免 scan_folios() 空转,并使扫描预算分配更符合 swappiness。
12/16
mm/mglru: Restrict eviction accounting to eligible zones
让 lruvec_evictable_size() 与 lru_gen_imbalanced() 只统计 reclaim_idx 以下可回收 zone,避免受保护 zone 的页数虚增扫描量,使 eligible zone 页少时 aging 更及时。
13/16
mm/mglru: Reduce LRU lock contention by shrinking folio batches in inc_min_seq
缩小 inc_min_seq 中每批从最老 gen 搬到次老 gen 的 folio 数量,缩短 lruvec 锁持有时间,降低并发 LRU 操作争用;仅调整批大小。
14/16
mm/mglru: Avoid prolonged anon reclaim with swappiness=200
swappiness=200 且 sc->priority < DEF_PRIORITY/2 时给文件回收一个很小因子,避免 MGLRU 在低优先级长期只回收 anon 导致负载显著变慢。
15/16
mm/mglru: Make swappiness=1 file reclaim more aggressive
在 swappiness=1 的高优先级回收中把 anon_factor 置 0,使 MGLRU 更激进地只回收文件页,与 swappiness=200 偏匿名页形成对称。
16/16
mm/mglru: Avoid scan anon while swapcache is low for GFP_NOIO allocation
对 GFP_NOIO 分配,在 swap cache 很低时把 MGLRU 匿名页扫描预算置零,避免扫描无法回收的 anon folio;沿用 CLRU 的低水位判断。