1. mm 未合并

    在 lruvec 锁之外摘除 deferred split folio

    三条 folio 批量释放路径原本大多在 lruvec 锁内把 refcount 归零的 folio 逐个摘出 deferred split 队列,而该队列由 list_lru 自有的 per-memcg per-node 锁保护;改为锁内攒批、解锁后按批摘除再 uncharge,fault 基准上 16K 大小的 mTHP folio 入队的运行时开销从 15% 降到噪声,lruvec 锁等待从 491 秒降到 38 秒

  2. mm 未合并

    swap 回退拆分时保持物理页顺序

    匿名 PMD folio 因整块 swap 分配失败而回退拆分时,先把子页收进临时链表,再反序搬到回收链表尾部,使 shrink_folio_list() 按 PFN 升序写回;NVMe/IOMMU 路径同一 8 MiB 数据的 IOVA links 从 2047 降到 64,PAGEOUT 与 cached-refault 的 worker CPU 时间之和降低 14.84%(单 worker)和 13.14%(双 worker)

  3. mm 未合并

    加速大系统的 CPU 热插拔

    删除或按条件跳过 CPU 上下线路径上过时的 WBINVD,CMCI 全员广播收窄到单个拓扑邻居,MTRR 一致时跳过全员会合,消除调度域重建、dl 带宽核算与 vmstat 阈值刷新中的重复计算;480 核 Intel 全量上下线从 106.23s 降到 5.07s,512 核 AMD 从 8.41s 降到 3.38s

  4. mm 未合并

    降低 zswap load 路径上的 request 竞争

    把 zswap 压缩与解压拆成各自独立的 per-CPU request、wait、mutex,同步算法的解压改用栈上 request,全程不取 zswap 锁,同步 transform 的 request 大小上限由 Crypto API 在初始化时强制,消除低优先级 store 被抢占对高优先级 load 的拖累;1 vCPU 最慢读延迟中位数 22.3ms 降至 0.97ms,8 vCPUs 由 314ms 降至 7.0ms

  5. mm 未合并

    为 MEMCG_SOCK 批量调用 mod_memcg_state()

    把 MEMCG_SOCK 的 mod_memcg_state() 计数缓存进 per-CPU memcg stock,按 ±MEMCG_CHARGE_BATCH 批量刷出;mem_cgroup_sk_charge() 命中 stock 时直接返回,sk_uncharge() 走 __refill_stock;NR_MEMCG_STOCK 7→6 保住单 cacheline;tcp_rr 吞吐 +8.71%,memcg sock 相关 cycles -66.4%

  6. mm 未合并

    把 zsmalloc 对象释放推迟到 per-CPU 批次

    zs_free() 不再同步释放对象,而是把 handle 追加到 per-CPU 的 64 项批次,满批经 lockless list 交给 unbound worker,空 zspage 回收也移到 worker;zram 的 5 个频繁更新的统计改为 per-CPU;256MB munmap 单进程加速 2.85 至 4.35 倍,4 进程并发加速 9.31 倍

  7. mm 未合并

    MGLRU 频率引导晋升与 page flag 精简

    用 folio 的访问次数(refs)在访问时主动引导 MGLRU generation 晋升,取代以回收时 PID 兜底为主的保护;PG_workingset 与 PG_referenced 并入 refs 编码,page flag 少用 1 位,PSI、readahead 与 Active/Inactive 统计随之修复;内核构建 file refault 下降 22.4%,MongoDB 吞吐提升 15.0%,Chromium 与 Node.js 一小时请求量提升 75.1%

  1. mm 未合并

    让 NFSD DIRECT 模式的 I/O 不污染 page cache

    把非对齐 WRITE 的切分点从 DIO 对齐改到页边界,让两个 WRITE 共享的页接力保留到双方写完,同步 WRITE 只 fsync 一次;交错写同一文件时设备读减少约 98%,pNFS 下写吞吐提升 2.4%~4.9%

  2. mm 未合并

    重新启用 lazyfree THP 的 PMD 级丢弃

    把 lazyfree THP 回收时的 PMD 从先清空再检查改为保持 invalidated 直到检查通过,统一各架构对 invalidated PMD 的 GUP-fast 与记账语义,重新启用 PMD 级整体丢弃,2MB 大页一次回收,不再拆成 512 个 PTE

  3. mm 未合并

    在隔离 folio 堆积时限流 MGLRU 回收

    给 MGLRU 回收补上 legacy 路径早有的隔离堆积节流:按 lruvec 粒度计数,以一个 generation 的可回收量为阈值,全部类型超限才睡眠,类型 mask 约束隔离选择;合成负载 64 线程吞吐提升 22%、192 线程避免 OOM,真实构建负载编译产出提升 52%

  4. mm 未合并

    收回 zap 路径放弃的 swap cache folio

    readahead 与并发 zap 的竞态让 swap count 归零、folio 未映射的 slot 永远悬置,生产主机上 250 GiB 内存与 250 GiB slot 被这类 folio 占住且只能靠 swapoff 回收;zap 路径放弃回收时叫醒每个 swap 设备的 sweep worker,由它以新增的 TTRS_WAIT 标志拿 folio 锁并等 writeback 结束,回头把这类 slot 收走

  5. mm 未合并

    降低 per-memcg shrinker unit 的内存开销

    memcg 上线时按 shrinker_nr_max 在每个 NUMA node 预分配全部 shrinker_info_unit,520 字节的 unit 只能住进 kmalloc-1k 槽位,45000 个 cgroup 的主机上 unit 吃掉 145 GB;让 unit 少管 1 个 id 恰好填满 512 字节槽位,再改为 memcg 首次在某 shrinker 的 list_lru 上拿链表时才按需安装,复现实测每 cgroup slab 占用从 548 KB 降到 42 KB

  6. lib 未合并

    LZ4 解码快循环加入软件流水化预取

    LZ4 解压冷 4 KiB 页时输入流与输出页都不在 L1 与 L2,解码反复 stall 在 cache miss 上;在解码快循环顶部插入 3 条软件流水化预取提示,读输入流前方 96 B 与 192 B、写意图预取输出页前方 128 B,让访存延迟与解码计算重叠;AMD EPYC 9755 真实 zswap 路径 Silesia 语料中位扫描时间从 1.0994 s 降到 1.0472 s,配对中位加速 5.09%,15 轮全部更快

  7. mm 未合并

    优化 mempool 扩容

    mempool 扩容时无论现有 elements 数组装不装得下都重新分配并整体拷贝,与极端负载下快速、无死锁分配的目标相悖;新增只增不减的 __elements_size 记录数组真实槽位数,扩容不超过它就只提 min_nr 再填充补齐,装不下才走分配路径并做并发双检,替换或多余的数组统一在锁外释放