diff --git a/drivers/android/vendor_hooks.c b/drivers/android/vendor_hooks.c index c7dace5fbf8b..d16aa3d3e2bb 100644 --- a/drivers/android/vendor_hooks.c +++ b/drivers/android/vendor_hooks.c @@ -293,3 +293,6 @@ EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_sd_update_bus_speed_mode); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_mmc_attach_sd); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_sdhci_get_cd); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_mmc_gpio_cd_irqt); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_save_vmalloc_stack); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_show_stack_hash); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_save_track_hash); diff --git a/include/linux/vmalloc.h b/include/linux/vmalloc.h index 76dad53a410a..0549ca17ba6f 100644 --- a/include/linux/vmalloc.h +++ b/include/linux/vmalloc.h @@ -9,6 +9,7 @@ #include /* pgprot_t */ #include #include +#include #include @@ -57,6 +58,7 @@ struct vm_struct { unsigned int nr_pages; phys_addr_t phys_addr; const void *caller; + ANDROID_OEM_DATA(1); }; struct vmap_area { diff --git a/include/trace/hooks/mm.h b/include/trace/hooks/mm.h index f4b839f69790..e6cec50cf1f4 100644 --- a/include/trace/hooks/mm.h +++ b/include/trace/hooks/mm.h @@ -78,6 +78,15 @@ DECLARE_HOOK(android_vh_mm_dirty_limits, unsigned long nr_reclaimable, unsigned long pages_dirtied), TP_ARGS(gdtc, strictlimit, dirty, bg_thresh, nr_reclaimable, pages_dirtied)); +DECLARE_HOOK(android_vh_save_vmalloc_stack, + TP_PROTO(unsigned long flags, struct vm_struct *vm), + TP_ARGS(flags, vm)); +DECLARE_HOOK(android_vh_show_stack_hash, + TP_PROTO(struct seq_file *m, struct vm_struct *v), + TP_ARGS(m, v)); +DECLARE_HOOK(android_vh_save_track_hash, + TP_PROTO(unsigned long p), + TP_ARGS(p)); /* macro versions of hooks are no longer required */ #endif /* _TRACE_HOOK_MM_H */ diff --git a/mm/slab.h b/mm/slab.h index 73775707d209..2564dd93718d 100644 --- a/mm/slab.h +++ b/mm/slab.h @@ -46,6 +46,7 @@ struct kmem_cache { #include #include #include +#include /* * State of the slab allocator. @@ -104,6 +105,9 @@ struct track { int cpu; /* Was running on cpu */ int pid; /* Pid context */ unsigned long when; /* When did the operation occur */ +#ifdef CONFIG_STACKTRACE + ANDROID_OEM_DATA(1); +#endif }; enum track_item { TRACK_ALLOC, TRACK_FREE }; diff --git a/mm/slub.c b/mm/slub.c index 0112c2a794b9..5b64953ae7b3 100644 --- a/mm/slub.c +++ b/mm/slub.c @@ -37,6 +37,7 @@ #include #include +#include #include "internal.h" @@ -609,6 +610,7 @@ static void set_track(struct kmem_cache *s, void *object, if (nr_entries < TRACK_ADDRS_COUNT) p->addrs[nr_entries] = 0; + trace_android_vh_save_track_hash((unsigned long)p); #endif p->addr = addr; p->cpu = smp_processor_id(); diff --git a/mm/vmalloc.c b/mm/vmalloc.c index 4c227c2d5e13..6699fb404d78 100644 --- a/mm/vmalloc.c +++ b/mm/vmalloc.c @@ -34,6 +34,7 @@ #include #include #include +#include #include #include @@ -2033,6 +2034,7 @@ static inline void setup_vmalloc_vm_locked(struct vm_struct *vm, vm->size = va->va_end - va->va_start; vm->caller = caller; va->vm = vm; + trace_android_vh_save_vmalloc_stack(flags, vm); } static void setup_vmalloc_vm(struct vm_struct *vm, struct vmap_area *va, @@ -3550,6 +3552,7 @@ static int s_show(struct seq_file *m, void *p) seq_puts(m, " vpages"); show_numa_info(m, v); + trace_android_vh_show_stack_hash(m, v); seq_putc(m, '\n'); /*