DEFINE_EVENT(kmem_cache, kmem_cache_alloc_trace, TP_PROTO(struct kmem_cache *c, gfp_t flags, size_t size), TP_ARGS(c, flags, size)); ``` 这段代码用于定义一个名为“kmem_cache_alloc_trace”的跟踪事件,它包含了参数“c”(kmem_cache结构体)、“flags”(分配标志)和“size”(分配的大小)...
kmem_cache_alloc_trace K8S是一种用于自动化部署、扩展和管理容器化应用程序的开源系统,其中涉及到很多关键词和操作。其中一个关键词就是【kmem_cache_alloc_trace】,它是内核中用于跟踪内存分配操作的函数。 在K8S中,我们经常需要对内存的分配和释放进行管理,通过使用【kmem_cache_alloc_trace】函数可以跟踪内核中的...
kmem_cache_alloc() 函数用于从 cache 申请一个 Obj,其直接调用 slab_alloc 分配一个 Obj。 /// @file mm/slab.c 3481 void *kmem_cache_alloc(struct kmem_cache *cachep, gfp_t flags) 3482 { 3483 void *ret = slab_alloc(cachep, flags, _RET_IP_); 3484 3485 trace_kmem_cache_alloc(_RET...
另外,kmalloc函数是基于SLUB机制释放的内存,可以通过上述的的slabtrace的节点看到对应的的内存大小再不断的增加: === kmem_cache: kmalloc-64 alloc_calls === 19537 selinux_cred_prepare+0x34/0x68 ffffff88f3498c04 ffffff88f349a078 ffffff88f349a0ac ffffff88f349e048 50318 hello_test_show+0x2c/...
kmem_cache_alloc+0x1ec/0x260 create_slub_error+0x20/0x80 [slub2] my_test_init+0x14/0x28 [slub2] do_one_initcall+0x90/0x1a0 do_init_module+0x60/0x1cc load_module+0x18dc/0x1d78 SyS_init_module+0x150/0x178 el0_svc_naked+0x24/0x28 ...
trace_kmem_cache_alloc(_RET_IP_, ret, s->objsize, s->size, gfpflags); return ret; } EXPORT_SYMBOL(kmem_cache_alloc); static __always_inline void *slab_alloc(struct kmem_cache *s, gfp_t gfpflags, int node, unsigned long addr) ...
通过命令 "perf list kmem:*" 或者 "perf list |grep kmem",可以列出 kmem 组中的所有追踪事件。静态追踪点与动态探针不同,它们被嵌入关键函数路径中,并非直接对应函数名。要查看这些追踪点的实际插入位置,可在事件名称前添加 "trace_"(如 "trace_mm_page_alloc"),然后在内核源码中进行搜索...
[ 142.638015] ? kmem_cache_alloc_trace+0x19e/0x2e0 [ 142.638022] do_init_module+0x52/0x260 [ 142.638028] load_module+0xb45/0xbe0 [ 142.638032] __do_sys_finit_module+0xbf/0x120 [ 142.638037] __x64_sys_finit_module+0x18/0x20 ...
kmem_cache_alloc+0x1ec/0x260 create_slub_error+0x20/0x80 [slub2] my_test_init+0x14/0x28 [slub2] do_one_initcall+0x90/0x1a0 do_init_module+0x60/0x1cc load_module+0x18dc/0x1d78 SyS_init_module+0x150/0x178 el0_svc_naked+0x24/0x28 ...
kmemleak通过追踪kmalloc(), vmalloc(), kmem_cache_alloc()等函数,把分配内存的指针和大小、时间、stack trace等信息记录在一个rbtree中,等到调用free释放内存时就把相应的记录从rbtree中删除。也就是说rbtree中的记录就是已经分配出去但尚未释放的内存,其中有些内存尚未释放是因为还在被使用,这属于正常情况,而不...