From eb0102684f4a41c93791f5e610438faf6e964ed7 Mon Sep 17 00:00:00 2001 From: Dezhi Huang Date: Fri, 17 May 2024 16:05:48 +0800 Subject: [PATCH] ANDROID: vendor_hooks: add hook to record slab alloc and free Add hook to record slab usage for calling slab_alloc_node and slab_free check for memory leaks. Bug: 379598560 Bug: 341216009 Change-Id: Ibb5f77b8244096fc999190244d197b7a40e6591c Signed-off-by: Dezhi Huang (cherry picked from commit d5c66ad281a72e29802ae72fec0526e58a151377) --- drivers/android/vendor_hooks.c | 2 ++ include/trace/hooks/mm.h | 6 ++++++ mm/slub.c | 5 +++++ 3 files changed, 13 insertions(+) diff --git a/drivers/android/vendor_hooks.c b/drivers/android/vendor_hooks.c index 19cf91ca7835..4911325dec12 100644 --- a/drivers/android/vendor_hooks.c +++ b/drivers/android/vendor_hooks.c @@ -192,6 +192,8 @@ EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_unreserve_highatomic_bypass); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_rmqueue_bulk_bypass); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_ra_tuning_max_page); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_tune_mmap_readaround); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_slab_alloc_node); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_slab_free); EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_selinux_avc_insert); EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_selinux_avc_node_delete); EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_selinux_avc_node_replace); diff --git a/include/trace/hooks/mm.h b/include/trace/hooks/mm.h index e4b5e99e0472..0b7f301eddf9 100644 --- a/include/trace/hooks/mm.h +++ b/include/trace/hooks/mm.h @@ -123,6 +123,12 @@ DECLARE_HOOK(android_vh_show_smap, TP_PROTO(struct seq_file *m, unsigned long writeback, unsigned long same, unsigned long huge), TP_ARGS(m, writeback, same, huge)); +DECLARE_HOOK(android_vh_slab_alloc_node, + TP_PROTO(void *object, unsigned long addr, struct kmem_cache *s), + TP_ARGS(object, addr, s)); +DECLARE_HOOK(android_vh_slab_free, + TP_PROTO(unsigned long addr, struct kmem_cache *s), + TP_ARGS(addr, s)); DECLARE_HOOK(android_vh_meminfo_cache_adjust, TP_PROTO(unsigned long *cached), TP_ARGS(cached)); diff --git a/mm/slub.c b/mm/slub.c index 32c73002a5c5..11bca20a0948 100644 --- a/mm/slub.c +++ b/mm/slub.c @@ -3420,6 +3420,8 @@ redo: out: slab_post_alloc_hook(s, objcg, gfpflags, 1, &object, init); + trace_android_vh_slab_alloc_node(object, addr, s); + return object; } @@ -3683,6 +3685,9 @@ static __always_inline void slab_free(struct kmem_cache *s, struct slab *slab, */ if (slab_free_freelist_hook(s, &head, &tail, &cnt)) do_slab_free(s, slab, head, tail, cnt, addr); + + trace_android_vh_slab_free(addr, s); + } #ifdef CONFIG_KASAN_GENERIC