v2
2026-10-20
热插拔分配器竞态修复 · v2
修复 zonelist 重建与 pageset 清空的内存热插拔竞态:热添加也需重试 zonelist_update_seq,并保护离线中的 pageset。
原始补丁链接
子 Patch(5)
1/5
mm/page_alloc: detect zonelist rebuilds from memory hot-add
热添加首个 zone 块经 build_zonerefs_node 原地重写 zonelist,而 check_retry_zonelist 仅限 MEMORY_HOTREMOVE,__GFP_THISNODE 并发遍历可能误判无可用 zone;序列检查改由 MEMORY_HOTPLUG 控制。
2/5
mm/page_alloc: validate zonelist slots against concurrent rebuilds
并发 build_all_zonelists 平移 zonelist 槽位,使迭代器已过滤的槽在再次取 zone 时变成另一 zone/node;分配遍历需重新校验槽位,避免落入 ZONE_MOVABLE 或 nodemask 外节点。
3/5
mm/page_alloc: snapshot the preferred zone against shrink rebuilds
get_page_from_freelist/alloc_pages_bulk_noprof 反复重读 preferred_zoneref->zone,离线重建可把该槽变成 NULL 并让 zone_statistics 崩溃;改为一次快照,陈旧 zone 安全。
4/5
mm/page_alloc: keep a zone's pagesets when it goes empty
zone_pcp_reset 释放 pageset 时,vmstat worker 可能仍持有 pcp 并在 decay_pcp_high 造成 UAF;改为 pageset 随 zone 生命周期保留,仅折叠统计,重上线复用。
5/5
mm/mmzone: read each zoneref slot once when filtering by nodemask
__next_zones_zonelist 先判 slot zone 非 NULL 再重读取 node,离线重建可能使第二次读到终止符并触发 zone_to_nid(NULL);改为每槽只读一次并复用。