mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-09-27 21:03:32 +00:00
mm/slub: Add Support for free path information of an object
This commit adds enables a stack dump for the last free of an object: slab kmalloc-64 start c8ab0140 data offset 64 pointer offset 0 size 64 allocated at meminfo_proc_show+0x40/0x4fc [ 20.192078] meminfo_proc_show+0x40/0x4fc [ 20.192263] seq_read_iter+0x18c/0x4c4 [ 20.192430] proc_reg_read_iter+0x84/0xac [ 20.192617] generic_file_splice_read+0xe8/0x17c [ 20.192816] splice_direct_to_actor+0xb8/0x290 [ 20.193008] do_splice_direct+0xa0/0xe0 [ 20.193185] do_sendfile+0x2d0/0x438 [ 20.193345] sys_sendfile64+0x12c/0x140 [ 20.193523] ret_fast_syscall+0x0/0x58 [ 20.193695] 0xbeeacde4 [ 20.193822] Free path: [ 20.193935] meminfo_proc_show+0x5c/0x4fc [ 20.194115] seq_read_iter+0x18c/0x4c4 [ 20.194285] proc_reg_read_iter+0x84/0xac [ 20.194475] generic_file_splice_read+0xe8/0x17c [ 20.194685] splice_direct_to_actor+0xb8/0x290 [ 20.194870] do_splice_direct+0xa0/0xe0 [ 20.195014] do_sendfile+0x2d0/0x438 [ 20.195174] sys_sendfile64+0x12c/0x140 [ 20.195336] ret_fast_syscall+0x0/0x58 [ 20.195491] 0xbeeacde4 Acked-by: Vlastimil Babka <vbabka@suse.cz> Co-developed-by: Vaneet Narang <v.narang@samsung.com> Signed-off-by: Vaneet Narang <v.narang@samsung.com> Signed-off-by: Maninder Singh <maninder1.s@samsung.com> Signed-off-by: Paul E. McKenney <paulmck@kernel.org>
This commit is contained in:
parent
0cbc124bce
commit
e548eaa116
4 changed files with 20 additions and 2 deletions
|
@ -640,6 +640,7 @@ struct kmem_obj_info {
|
||||||
struct kmem_cache *kp_slab_cache;
|
struct kmem_cache *kp_slab_cache;
|
||||||
void *kp_ret;
|
void *kp_ret;
|
||||||
void *kp_stack[KS_ADDRS_COUNT];
|
void *kp_stack[KS_ADDRS_COUNT];
|
||||||
|
void *kp_free_stack[KS_ADDRS_COUNT];
|
||||||
};
|
};
|
||||||
void kmem_obj_info(struct kmem_obj_info *kpp, void *object, struct page *page);
|
void kmem_obj_info(struct kmem_obj_info *kpp, void *object, struct page *page);
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -564,7 +564,7 @@ EXPORT_SYMBOL_GPL(kmem_valid_obj);
|
||||||
* depends on the type of object and on how much debugging is enabled.
|
* depends on the type of object and on how much debugging is enabled.
|
||||||
* For a slab-cache object, the fact that it is a slab object is printed,
|
* For a slab-cache object, the fact that it is a slab object is printed,
|
||||||
* and, if available, the slab name, return address, and stack trace from
|
* and, if available, the slab name, return address, and stack trace from
|
||||||
* the allocation of that object.
|
* the allocation and last free path of that object.
|
||||||
*
|
*
|
||||||
* This function will splat if passed a pointer to a non-slab object.
|
* This function will splat if passed a pointer to a non-slab object.
|
||||||
* If you are not sure what type of object you have, you should instead
|
* If you are not sure what type of object you have, you should instead
|
||||||
|
@ -609,6 +609,16 @@ void kmem_dump_obj(void *object)
|
||||||
break;
|
break;
|
||||||
pr_info(" %pS\n", kp.kp_stack[i]);
|
pr_info(" %pS\n", kp.kp_stack[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (kp.kp_free_stack[0])
|
||||||
|
pr_cont(" Free path:\n");
|
||||||
|
|
||||||
|
for (i = 0; i < ARRAY_SIZE(kp.kp_free_stack); i++) {
|
||||||
|
if (!kp.kp_free_stack[i])
|
||||||
|
break;
|
||||||
|
pr_info(" %pS\n", kp.kp_free_stack[i]);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(kmem_dump_obj);
|
EXPORT_SYMBOL_GPL(kmem_dump_obj);
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -4011,6 +4011,13 @@ void kmem_obj_info(struct kmem_obj_info *kpp, void *object, struct page *page)
|
||||||
if (!kpp->kp_stack[i])
|
if (!kpp->kp_stack[i])
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
trackp = get_track(s, objp, TRACK_FREE);
|
||||||
|
for (i = 0; i < KS_ADDRS_COUNT && i < TRACK_ADDRS_COUNT; i++) {
|
||||||
|
kpp->kp_free_stack[i] = (void *)trackp->addrs[i];
|
||||||
|
if (!kpp->kp_free_stack[i])
|
||||||
|
break;
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
|
@ -983,7 +983,7 @@ int __weak memcmp_pages(struct page *page1, struct page *page2)
|
||||||
* depends on the type of object and on how much debugging is enabled.
|
* depends on the type of object and on how much debugging is enabled.
|
||||||
* For example, for a slab-cache object, the slab name is printed, and,
|
* For example, for a slab-cache object, the slab name is printed, and,
|
||||||
* if available, the return address and stack trace from the allocation
|
* if available, the return address and stack trace from the allocation
|
||||||
* of that object.
|
* and last free path of that object.
|
||||||
*/
|
*/
|
||||||
void mem_dump_obj(void *object)
|
void mem_dump_obj(void *object)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in a new issue