v1 2026-10-28

修复 pfn walker 与离线竞态 · v1

修复 pfn walker 检查 online 后仍访问已离线/释放 memmap 的竞态;引入 pfn_walk SRCU 段并让 compaction、page_owner 等持锁。

原始补丁链接

子 Patch(6)

1/6
mm/compaction: wait for pfn walkers before poisoning offlined memmap
compaction 校验 pageblock 在线后会睡眠/放锁再用页,离线可能 poison memmap 致 set_pageblock_skip() 崩溃;用 SRCU-fast pfn_walk 读段覆盖到末次使用,并让 remove_pfn_range_from_zone() 等 walker 结束再 poison。
2/6
mm/page_owner: hold off memory offline while a page is read
read_page_owner() 在 pfn_valid() 后、print_page_owner() 读页前可能睡眠,离线会释放 vmemmap 并使 get_pageblock_migratetype() 缺页;改为整个读取期间持 get_online_mems(),阻止该页被离线。
3/6
mm/memory-failure: keep the page online while handling it
memory_failure()/soft_offline_page()/unpoison_memory() 在线检查后会等 mf_mutex,期间离线可 poison/free memmap 致 get_hwpoison_page() 崩溃;用 get_online_mems() 从检查前持到末次使用,保持页在线。
4/6
mm/page_alloc: don't undo another isolation in alloc_contig_range
[Re: [PATCH 4/6] mm/page_alloc: don’t undo another isolation in alloc_contig_range] On 2026-10-27 14:37 +0100, David Hildenbrand (Arm) wrote: > On 10/27/26 05:22, Gregory Price (Meta) wrote: > > We h
5/6
mm/page_alloc: keep the range online while alloc_contig isolates it
alloc_contig_pages() 在 zone->lock 下确认范围在线后放锁,离线可能在其后 isolate_single_pageblock() 读页 zone 前 poison memmap;用 get_online_mems() 覆盖校验到隔离结束,阻止范围离线。
6/6
mm/hwpoison-inject: keep the page online while filtering it
hwpoison_inject() 在 pfn_valid() 后运行 shake_folio()/filter 可能睡眠,离线会释放 vmemmap;改为持 get_online_mems() 做 pfn_to_online_page() 和过滤,进 memory_failure() 前释放,避免重复持锁。