v2 2026-07-20

减少obj_ext内存浪费 · v2

补丁系列重构 slab 对象扩展(slabobj_ext)结构,减少未启用分配 profiling 时的内存占用。

原始补丁链接

子 Patch(13)

1/13
mm/slab: skip kfence objects in allocation profiling
跳过 KFENCE 对象的分配 profiling,因为 KFENCE 对象数量少且 obj_exts 处理复杂,避免不必要的 slabobj_ext 分配和泄漏。
2/13
mm/slub: skip handle_failed_objexts_alloc() with profiling disabled
在 profiling 禁用时跳过 handle_failed_objexts_alloc(),避免为仅 objcg 指针的 obj_ext 数组执行不必要的处理。
3/13
mm/slab: remove objs_per_slab()
移除 objs_per_slab() 函数,因其 unused kmem_cache 参数且 slab->objects 更简单,替换最后两个使用者。
4/13
mm: move struct slabobj_ext to mm/slab.h
将 struct slabobj_ext 从 include/linux/memcontrol.h 移到 mm/slab.h,减少内部结构暴露和后续修改的编译影响。
5/13
mm/slab: make slab_obj_ext() determine object index
让 slab_obj_ext() 内部计算对象索引,调用者只需传对象指针,简化调用并消除重复的 obj_to_index() 计算。
6/13
mm/slab: abstract slabobj_ext.objcg access
抽象 slabobj_ext.objcg 的访问为 slab_obj_ext_objcg()/slab_obj_ext_set_objcg(),重命名字段为 _objcg 防止直接访问。
7/13
mm/slab: abstract slabobj_ext.ref access
抽象 slabobj_ext.ref 的访问为 slab_obj_ext_codetag_ref(),重命名字段为 _ctref 防止直接访问,为后续结构变化做准备。
8/13
mm/slab: replace slab.stride with obj_exts_in_object
用 obj_exts_in_object 标志替换 slab.stride 字段,通过标志判断 stride 是 sizeof(slabobj_ext) 还是 s->size,简化计算。
9/13
mm/slab: change struct slabobj_ext to a union
将 struct slabobj_ext 改为 union,使 objcg 和 codetag_ref 共享空间,数组元素翻倍但保持相邻布局,减少未使用字段的内存浪费。
10/13
mm/slab: introduce slab_obj_ext_has_codetag()
引入 slab_obj_ext_has_codetag() 及其静态键,在 kmem_cache_init() 时快照 mem_alloc_profiling_permanently_disabled() 状态,用于动态调整 slabobj_ext 数组大小。
11/13
mm/slab: reduce slabobj_ext memory with allocation profiling disabled
当分配 profiling 编译但永久禁用时,停止为 codetag_ref 部分分配 slabobj_ext 内存,减少元数据内存浪费。
12/13
mm/slab: add cache_ and slab_needs_objcg() helpers
添加 cache_needs_objcg()/slab_needs_objcg() 和 SLAB_MAY_ACCOUNT 标志,KMALLOC_NORMAL 缓存不设置该标志,并在 slab 中添加 obj_exts_needs_objcg 标志加速 fast path。
13/13
mm/slab: stop allocating objcg pointers when unnecessary
根据 slab_needs_objcg() 动态计算 slabobj_ext 大小,KMALLOC_NORMAL 缓存不再分配 objcg 指针;添加相应检查到 mem_cgroup_from_obj_slab() 和 memcg_slab_free_hook()。