-
移植 LZ4 上游快速解码循环
移植 upstream LZ4 fast decode loop,以 64 字节输出余量为界切换定宽拷贝与 safe loop,zswap swap-in scan 中位改善 5.13%,测试构建的 .text 增加 79.5%
-
减少 lruvec 统计更新引发的 cacheline 竞争
重排 mem_cgroup_per_node 的 cacheline 分组,并让 folio 与 kmem 统计更新绕过 lruvec 直写计数,消除 spatial prefetching 造成的 cacheline 竞争,单 memcg 多线程 shmem 吞吐最高提升约 22%
-
D-cache 别名刷新从整 folio 缩减到单页
sparc64 虚拟索引 L1 D-cache 机器上,mremap 换色移动 large folio 时把整 folio 跨核刷新改为只刷当前 PTE 映射的单页,并让 move_pte 获知批量 PTE 数量以便批处理下逐页刷新,同时补全 vmalloc 映射与解映射时的 D-cache 刷新;一次换色 mremap 消除约 100 万次冗余页刷新,Sun Fire V240 上省 7.3 秒
-
mmap_lock 忙时 uprobe 不再堵住 fork()
uprobe 注册/注销与 fork 双方改为 trylock 加事后等待,不再持 dup_mmap_sem 睡 mmap_lock,busy mmap_lock 下最长 fork 从 422ms 降到 0.47ms
-
让 reclaim 批量换出在 swap 上保持连续
reclaim 换出前按 order 报备批量页数,allocator 为报备内的分配取连续 swap slot 恢复写合并,相对 7.3 每事务设备写请求 -36%、iocost 开启时吞吐 +41%
-
NUMA balancing 迁移 large folio 失败时唤醒 kcompactd
NUMA balancing promote large folio 时,目标节点分配失败就唤醒该节点的 kcompactd 规整碎片,失败 THP 迁移从约 4.5k 次每天降到约 80 次,CXL 带宽占用降低约 25%
-
vmemmap 不再为超出 max_pfn 的 PFN 准备后备内存
LoongArch 16KiB 基页时一个 PMD 映射 32MiB vmemmap,是单个 512MiB section 需求的 16 倍,大页路径按整 PMD 装映射,末尾 PMD 为超出 max_pfn 的 PFN 白分配后备内存;改为仅对越过 max_pfn 的那个 PMD 回落基页填充,其余保留大页映射,34GiB 系统 vmemmap 从 160MiB 降到 136MiB,省 24MiB
-
把 slab 记账改为 cache 级显式声明
memcg 记账从默认一律预留 objcg 槽位改为 cache 级显式 opt-in,声明 SLAB_MAY_ACCOUNT 或 SLAB_ACCOUNT 的 cache 才允许 __GFP_ACCOUNT 记账并保留槽位,未声明的 cache 不再为每个对象预留 8 字节,全树排查补齐声明并以 debug 告警兜底漏网路径;idle x86 虚拟机启动后 slabobj_ext 从 1,280KB 降到 910KB(-29%)
-
减小 kdump vmcore 的体积与捕获时间
memblock 新增 MEMBLOCK_NODUMP;DT 的 /reserved-memory 项默认不可转储(CMA 可复用区例外),DT 展开后统一打标,DT 架构的 crash header 在 memblock 遍历中跳过 NOMAP/NODUMP;riscv 切到 memblock 遍历,三架构重复遍历折叠进弱默认,header 准备用 device_hotplug_lock 串行化,vmcore 更小、捕获更快
-
DAMON_RECLAIM 可忽略水位线,内存充裕时也强制回收冷页
DAMON_RECLAIM 只在 free memory rate 处于 [wmarks_low, wmarks_mid] 区间时激活,回收冷页本身抬高水位,scheme 刚见成效就越过上沿自停,内存充裕时挤不动冷匿名页;新增 ignore_wmarks 模块参数,置 Y 后 scheme 的水位条件换成 DAMOS_WMARK_NONE,等待恒为零,scheme 常驻,只受 min_age 与 quota 约束,面向 VMM 停放空闲沙箱后立即挤出冷匿名页、降低内存驻留的场景
-
MGLRU 下 swapcache 稀少时 GFP_NOIO 回收跳过 anon 扫描
把传统 LRU 已有的低 swapcache 回避判定接入 MGLRU:GFP_NOIO 下 swapcache 低于 anon 总量 1/64 时,由 get_scan_swappiness() 统一容量估计、扫描预算、aging 决策与驱逐的策略口径,全部排除 anon 只扫 file generation,代价是推进 max_seq 时同步搬运最老 anon generation 的 folio;dm-verity 经 dm-bufio 的 NOIO 分配中位耗时从 181.196 ms 降到 0.465 ms
-
虚拟 swap 空间(swap table 版)
新增虚拟 swap 设备,将 swap entry 与物理后备解耦,zswap 与全零页不再占用物理槽位,swap 空间按需动态增长且仅物理后备计入 memcg,Instagram 生产负载延迟降低约 1-3%,zswap 用户的 swapfile 占用完全消除
-
shrinker_info_unit 改用专用 kmem_cache 分配
shrinker_info_unit 在 64 位机上共 520 字节,kzalloc_node() 按 2 的幂分槽只能把它放进 kmalloc-1k,每个 unit 近一半是 padding,而 unit 数量随 cgroup 数乘 node 数乘 shrinker id 段数放大;改为建一个按 520 字节实际大小分槽的专用 kmem_cache,且不做 cacheline 对齐,8000 个 tmpfs 挂载加 2000 个空 cgroup 下,每个 cgroup 的 unreclaimable slab 从 144 KB 降到 87 KB
-
基于 BPF 的 per-cgroup NUMA balancing 模式选择
NUMA balancing 只有全局开关与全局模式位,无法兼顾时延敏感与批处理两类负载;把 NUMA_BALANCING_* 位掩码存进每个 cgroup,BPF 程序用 bpf_numab_set_mode() 与 bpf_numab_get_mode() 两个 kfunc 写请求、读回,热路径在 static key 后沿祖先链读时合并:opt-out 绑定子树,否则各请求位按位或独立生效;schbench 384 workers 实测 override 本身没有可测开销