-
arm64 把 .text 与 .init.text 合并分配
arm64 模块的 .text 与 .init.text 合入同一次 execmem ROX cache 分配,两段永不超出直接分支范围,init 专用 PLT 与 ftrace trampoline 随之删除
-
reparent 时搬移 LRU size 记账而非复制
memcg offline 时 reparent 只贷记父级却不清零子级,dying memcg 留下幽灵计数器使扫描空转、shadow node 限额超配;改为搬移后子级归零
-
清理 folio 拆分并放开 swapcache 拆分限制
folio 拆分按 anon 与 file 分离,放开 swapcache 高 order 与 non-uniform 拆分限制,单次拆分约快 2%
-
修剪而非清空 per-cpu charge stock
charge stock 高水位与清空目标同值致交错流量下持续清空失效,借页分配器水位分离改为超上限才修剪到下限,消除抖动
-
为较小的 large folio 启用 LRU cache
将 per-CPU LRU cache 准入放宽到较小的 large folio(含 mTHP)走缓存批量下发,摊薄 zone LRU 锁,主 LRU 锁获取降约 88%
-
为 free_pud_range() 补调度点
进程退出释放稀疏 2.5 TiB 映射的页表页,连续 20ms 以上无调度点饿死 softirq,free_pud_range() 补 cond_resched() 后最大间隔降到 2ms 以下
-
为 __unmap_hugepage_range() 补调度点
稀疏 HugeTLB unmap 遍历空 huge PTE,连续 40ms 以上无调度点饿死 softirq,循环开头补 cond_resched(),最大间隔降到 2.5ms 以下
-
把 iova 区间索引从 rbtree 切换到 maple tree
iova 区间索引从 rbtree 换为 maple tree,alloc_iova() 由线性搜索变为 O(log n),消除生产环境 soft lockup 隐患
-
修正 tmpfs 大页资格检查中的 vm_flags 误用
MADV_HUGEPAGE 流程在 vma->flags 更新前就调用 khugepaged 注册,资格检查直读 VMA 旧标志,huge=advise 的 tmpfs VMA 被误判无大页资格而丢失折叠机会;把注册挪到标志写入之后,恢复 tmpfs 及时折叠成 PMD 级大页
-
引入按 memory tier 的 memcg 记账与控制
按 (memcg, tier) 建独立 page_counter,memory.tier 逐层读写 high/max,超限在该 tier 节点范围回收或 OOM
-
stock slot 清空时释放 css 引用
consume_stock() 把 slot 余额吃到 0 却不放 css 引用,drain 只认有余额的 slot,memcg 滞留 dying;余额归零即放引用、腾出 slot
-
避免 vmstats 与 events 之间的 false sharing
vmstats_percpu 与事件计数共 cacheline 引发 false sharing,移 cgwb_list 入对齐空隙隔开,mremap 吞吐恢复
-
直接映射 large folio 的 pool 与 scratchpad bump allocator
引入直接映射 large folio 的两个 bump allocator,netfilter 事务时延 -13.3%,lockdep 静态数组归零
-
让 shmem unused huge shrinker 感知 memcg
shmem unused huge shrinker 列表转为 memcg 感知 list_lru,memcg 回收只走本 memcg 候选,消除误伤与无效扫描