v3
2026-07-27
减少obj_ext内存浪费 · v3
重构slab对象扩展结构,优化内存布局以减少分配跟踪的内存开销。
原始补丁链接
子 Patch(13)
1/13
mm/slab: skip kfence objects in allocation profiling
跳过kfence对象在分配profile中的统计,因其数量少、影响小,避免obj_exts分配复杂化,在相关slab钩子中跳过kfence项。
2/13
mm/slab: remove objs_per_slab()
移除objs_per_slab()函数,直接使用slab->objects代替,并在kfence测试中做类型转换以避免bit-field警告。
3/13
mm: move struct slabobj_ext to mm/slab.h
将struct slabobj_ext从memcontrol.h移至slab.h,减少非slab模块对内部结构的暴露,降低后续修改的编译波及范围。
4/13
mm/slab: make slab_obj_ext() determine object index
修改slab_obj_ext()使其内部调用obj_to_index(),调用方只需传对象指针,简化外部接口并消除重复计算。
5/13
mm/slab: abstract slabobj_ext.objcg access
抽象slabobj_ext.objcg的获取与设置函数slab_obj_ext_objcg()/slab_obj_ext_set_objcg(),字段重命名为_objcg防止直接访问。
6/13
mm/slab: abstract slabobj_ext.ref access
抽象slabobj_ext.ref的访问函数slab_obj_ext_codetag_ref(),字段重命名为_ctref,防止直接访问并为后续结构变化做准备。
7/13
mm/slab: replace slab.stride with obj_exts_in_object
用obj_exts_in_object标志代替stride字段,slab_obj_ext()根据标志决定步长,简化计算并支持后续动态size调整。
8/13
mm/slab: change struct slabobj_ext to a union
将struct slabobj_ext改为union,objcg和codetag_ref共用存储,数组大小加倍,保持相邻布局,后续可动态按需分配,节省内存。
9/13
mm/slab: introduce slab_obj_ext_has_codetag()
引入slab_obj_ext_has_codetag()静态键,在kmem_cache_init()时根据mem_alloc_profiling_permanently_disabled()状态设置,用于动态确定slabobj_ext大小。
10/13
mm/slab: reduce slabobj_ext memory with allocation profiling disabled
当分配profile编译但永久禁用时,利用slab_obj_ext_has_codtag()在cache_obj_ext_size()中停止申请codetag_ref空间,handle_failed_objexts_alloc()也需检查避免写无效内存。
11/13
mm/slab: add cache_ and slab_needs_objcg() helpers
添加cache_needs_objcg()/slab_needs_objcg(),通过SLAB_MAY_ACCOUNT标记和slab内obj_exts_needs_objcg字段(64位),快速判断槽位是否需要objcg指针。
12/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()中做检查跳过。
13/13
mm/slab, kfence, memcg: completely remove obj_ext for kfence objects
完全停止为kfence对象分配obj_exts,不再做memcg_kmem会计和分配profile,利用slab_obj_exts()返回0来简化代码,移除大量is_kfence_address()检查。