slub track_item

发布时间:2026/10/23 8:39:18

slub track_item 定义分配/释放跟踪的枚举以及sysfs / debugfs 接口的编译期桩函数。一、跟踪项枚举enum track_item { TRACK_ALLOC, TRACK_FREE };配合上一段的struct track使用。SLUB 在开启SLAB_STORE_USER调试标志后会在每个对象关联一个struct track数组记录该对象最近的操作历史。track_item标明这次记录的是哪种操作值含义TRACK_ALLOC记录“分配”事件写入是谁、在哪、何时分配了这个对象TRACK_FREE记录“释放”事件写入是谁、在哪、何时释放了这个对象典型用法// 分配时 set_track(s, object, TRACK_ALLOC); // 释放时 set_track(s, object, TRACK_FREE);set_track()内部会填充struct track的addr、handle、cpu、pid、when字段并调用save_stack()或save_stack_depot()保存调用栈。为什么是数组TRACK_ADDRS_COUNT 16说明这不是单个记录而是每个对象一小段历史。常见设计是struct track { ... } track[TRACK_ADDRS_COUNT]; // 或按 track_item 索引更准确地说SLUB 通常为每个对象维护最近 16 次操作的环形记录在CONFIG_SLUB_DEBUG且SLAB_STORE_USER下通过struct track数组按TRACK_ADDRS_COUNT组织用来追溯对象被谁分配、谁释放是否重复释放是否释放后又被使用结合 poison内存泄漏时最后一次分配者是谁TRACK_ALLOC/TRACK_FREE就是区分这些历史记录的标签。二、sysfs 接口的条件编译#ifdef SLAB_SUPPORTS_SYSFS static int sysfs_slab_add(struct kmem_cache *); static int sysfs_slab_alias(struct kmem_cache *, const char *); #else static inline int sysfs_slab_add(struct kmem_cache *s) { return 0; } static inline int sysfs_slab_alias(struct kmem_cache *s, const char *p) { return 0; } #endif背景/sys/kernel/slab/SLUB 会为每个 kmem_cache在 sysfs 下创建条目路径通常是/sys/kernel/slab/cache_name/里面暴露属性如object_size、objs_per_slab、order、slabs、objects、cpu_partial、partial、aliases、shrink、trace等用于查看和调优每个缓存。sysfs_slab_add()负责注册一个缓存对应的 sysfs 目录和属性。sysfs_slab_alias()负责创建别名当两个缓存因为合并CONFIG_SLAB_MERGE_DEFAULT而实际共用同一个底层缓存时sysfs 下通过别名指向同一个目录避免重复创建。SLAB_SUPPORTS_SYSFS这个宏由体系结构或配置决定是否支持 slab sysfs 接口。支持时声明真正的函数原型定义在mm/slub.c的后面或mm/slab_common.c不支持时提供空的内联桩static inline int sysfs_slab_add(struct kmem_cache *s) { return 0; } static inline int sysfs_slab_alias(struct kmem_cache *s, const char *p) { return 0; }桩函数返回 0调用点如kmem_cache_create里无需#ifdef代码更干净且不支持的平台上调用完全被优化掉。这是内核里很常见的“接口 空桩”模式把条件编译集中在头文件业务代码统一调用。三、debugfs 接口的条件编译#if defined(CONFIG_DEBUG_FS) defined(CONFIG_SLUB_DEBUG) static void debugfs_slab_add(struct kmem_cache *); #else static inline void debugfs_slab_add(struct kmem_cache *s) { } #endif背景/sys/kernel/debug/slab/debugfs 提供更偏调试的接口sysfs 是稳定 ABIdebugfs 不是。SLUB 在 debugfs 下创建条目用于导出更详细的调试信息提供运行时调试控制如动态开启/关闭某些缓存的调试debugfs_slab_add()就是为缓存创建 debugfs 条目。条件需要同时满足CONFIG_DEBUG_FS内核编译了 debugfs 支持。CONFIG_SLUB_DEBUG编译了 SLUB 调试支持。任一不满足就退化为空的内联桩函数。和 sysfs 一样调用点无需#ifdef。两者的对称结构接口条件支持时不支持时sysfs_slab_add/sysfs_slab_aliasSLAB_SUPPORTS_SYSFS真函数返回 0 的 inline 桩debugfs_slab_addCONFIG_DEBUG_FS CONFIG_SLUB_DEBUG真函数空 inline 桩这种对称性说明 SLUB 同时维护两套用户/调试可见接口sysfs 面向稳定观测和调优debugfs 面向深度调试。四、几句话串联kmem_cache_create() └─ sysfs_slab_add(s) // 创建 /sys/kernel/slab/name/ └─ debugfs_slab_add(s) // 创建 debugfs 条目仅调试配置 分配/释放对象开启 SLAB_STORE_USER └─ set_track(s, obj, TRACK_ALLOC / TRACK_FREE) └─ struct track { addr, handle, cpu, pid, when }track_item和struct track是调试追踪的一部分记录对象生命周期。sysfs_slab_add/debugfs_slab_add是观测接口把缓存信息暴露给用户空间。五、一句话总结enum track_item { TRACK_ALLOC, TRACK_FREE }标记struct track记录的是分配还是释放事件用于对象生命周期追踪。sysfs 部分支持SLAB_SUPPORTS_SYSFS时用真函数注册/sys/kernel/slab/条目和别名否则用返回 0 的 inline 桩消除调用点的条件编译。debugfs 部分仅在CONFIG_DEBUG_FS CONFIG_SLUB_DEBUG时提供debugfs_slab_add()否则空桩。
延伸阅读

更多相关文章

2026/10/23 8:39:18

东华OJ刷题记录:第66-70题模板与踩坑指南

东华oj刷题记录,我本来只打算在自己的笔记里写两句话就翻篇。结果第66到第70题这一批,做完之后我回头一看,发现几乎每道题都让我多花了一些“不该花的功夫”,而这些功夫其实都可以靠读题习惯和几个固定模板省下来。所以干脆单独整…

2026/10/23 8:39:18

slub track

SLUB 调试功能 SLAB_STORE_USER 的核心数据结构,用来记录“谁在什么时候、在哪个 CPU 上、以什么调用栈操作了某个对象”。一、整体定位/** Tracking user of a slab.*/ #define TRACK_ADDRS_COUNT 16 struct track {unsigned long addr; /* Called from address */…

2026/10/23 8:39:18

slub DEBUG_METADATA_FLAGS

需要额外元数据的调试标志、对象数的位域编码,以及内部标志位定义的宏。一、需要额外元数据的调试标志/** Debugging flags that require metadata to be stored in the slab. These get* disabled when slab_debugO is used and a caches min order increases wit…

2026/10/23 9:49:48

.Net Core 2.1 JWT身份认证实战:从Token生成到问题排查

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/23 9:49:48

【c++】c语言入门到c++使用高手: c语言入门之指针(三)

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/23 9:49:48

【c++】c语言入门到c++使用高手: c语言入门之指针(一)

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/23 9:49:48

Windows Server 2008 IIS SSL证书安装与TLS调优实战

1. 先搞明白:为什么在老系统上装证书比新系统费劲干运维这行的,多少都会碰到一台跑着 Windows Server 2008 的老机器,上面挂着 IIS,业务还活着,老板一句"网站要上 HTTPS",活儿就落到你头上。Wind…

2026/10/23 9:49:48

Dify批量处理实战:从重复劳动到高效工作流维护

做工作流开发的人大概都有过这种体验:一个业务场景跑通之后,紧接着就是无穷无尽的重复劳动——同样的节点配置要在十几个工作流里各改一遍,同样的变量名要挨个核对,同样的模型参数要逐个调整。单条流程调试的时候还好,…

2026/10/23 9:44:47

港口存量摄像头零成本实现跨镜追踪与无感管控

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/22 11:29:28

金融AI落地指南:从调研报告到技术选型与工程实践

简介:这份PDF报告聚焦2025年金融服务业中国AI现状与趋势,面向金融科技从业者、AI战略规划人员及关注行业数字化转型的研究者,帮助读者把握生成式AI在银行、支付、交易等场景中的落地路径与投资方向。资源包内含1个PDF文件,大小约1…

2026/10/23 0:02:26

Verilog实现FPGA密码锁:矩阵键盘与状态机设计实战

说实话,这几年接触了不少想入门FPGA的朋友,如果你问哪个项目能一口气把Verilog的核心基本功串起来,我通常会推荐电子密码锁。这个项目看着不起眼,却把矩阵键盘扫描、按键消抖、状态机设计、动态显示刷新、外设控制这些数字逻辑里的…

2026/10/23 0:02:26

数据服务监控运维实战:从指标体系到告警治理与故障排查

周末凌晨两点,手机震了。第一反应是“数据服务挂了”。打开电脑看了下,果然,某张核心报表的数据产出时间已经超过SLA两小时,下游三个业务方连着发来问询。这种场景,做过大数据运维的人都不会陌生。数据服务的监控与运维…

2026/10/23 0:02:26

FreeRTOS任务通知实战详解:内核原理、API与避坑指南

裸机编程切到RTOS之后,任务之间的通信和同步永远是躲不开的坎。前面聊过队列、信号量、互斥锁、事件组,这次把FreeRTOS任务通知(Task Notification)单独拎出来讲透。原因很简单:任务通知是FreeRTOS里最容易用错、也最容…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑