v10
2026-09-15
alloc_tag 标签修复 · v10
修复模块alloc_tag/codetag溢出与节区竞态,并解决mod_lock下remove_proc_entry与allocinfo读锁死锁。
原始补丁链接
子 Patch(6)
1/6
alloc_tag: move release_module_tags() above reserve_module_tags()
把 release_module_tags() 移到 reserve_module_tags() 之前,使后者在 reservation 已存入 maple tree 后失败时能调用 cleanup 回滚,避免前向声明,无功能变化。
2/6
alloc_tag: clean up the populate failure path
修复 vm_module_tags_populate() 失败路径:释放 maple tree 中已存 reservation 并回滚 module_tags.size,撤销 vmap 已装 PTE;否则并发加载复用空洞写未映射内存,重试会 BUG。
3/6
module: introduce SH_ENTSIZE_STANDALONE for separately allocated sections
引入 SH_ENTSIZE_STANDALONE 标记独立分配段,percpu 首用;layout_sections/move_module 跳过,apply_relocations 恢复仅看 SHF_ALLOC,并在 sysfs sections 属性中跳过,避免无单一地址。
4/6
module: allocate codetag sections before the regular module layout
在 layout 前一次完成 codetag 段判定与分配,防止并发关 profiling 后 move_module 拷到 offset 0 覆盖;溢出错 -EAGAIN 回退常规数据,并回滚 reservation/size、清零 NOBITS,overflow 检查不再依赖 profiling 开关。
5/6
alloc_tag: skip percpu counter allocation when profiling is disabled
profiling 关闭时令 codetag_load_module 的 load_module 返回 -EOPNOTSUPP,跳过每 tag 的 percpu counter 分配,避免 release_module_tags 找不到模块导致 unload 泄漏;unload 总是 free_section_mem 清理预留。
6/6
alloc_tag: Defer /proc/allocinfo removal to a workqueue
把 /proc/allocinfo 删除从 mod_lock 写临界区内的 shutdown_mem_profiling 移到 workqueue,避免 remove_proc_entry 等读者而 allocinfo_start 取 mod_lock 形成死锁;并把文件创建延后到 alloc_tag_init 末尾。