diff --git a/drivers/android/vendor_hooks.c b/drivers/android/vendor_hooks.c index 28c0ed60c6b2..92c5d9b5346b 100644 --- a/drivers/android/vendor_hooks.c +++ b/drivers/android/vendor_hooks.c @@ -174,6 +174,8 @@ EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_mem_cgroup_alloc); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_cma_alloc_bypass); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_isolate_freepages); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_oom_check_panic); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_rmqueue_smallest_bypass); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_free_one_page_bypass); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_adjust_alloc_flags); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_binder_wait_for_work); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_alloc_oem_binder_struct); diff --git a/include/trace/hooks/mm.h b/include/trace/hooks/mm.h index a36a39497d73..c5ea0213cc8c 100644 --- a/include/trace/hooks/mm.h +++ b/include/trace/hooks/mm.h @@ -57,6 +57,14 @@ DECLARE_HOOK(android_vh_oom_check_panic, TP_PROTO(struct oom_control *oc, int *ret), TP_ARGS(oc, ret)); +DECLARE_HOOK(android_vh_rmqueue_smallest_bypass, + TP_PROTO(struct page **page, struct zone *zone, int order, int migratetype), + TP_ARGS(page, zone, order, migratetype)); +DECLARE_HOOK(android_vh_free_one_page_bypass, + TP_PROTO(struct page *page, struct zone *zone, int order, int migratetype, + int fpi_flags, bool *bypass), + TP_ARGS(page, zone, order, migratetype, fpi_flags, bypass)); + struct page_vma_mapped_walk; DECLARE_HOOK(android_vh_slab_alloc_node, TP_PROTO(void *object, unsigned long addr, struct kmem_cache *s), diff --git a/mm/page_alloc.c b/mm/page_alloc.c index 46921ecdd773..6a9635b503e5 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c @@ -784,6 +784,13 @@ static inline void __free_one_page(struct page *page, unsigned long combined_pfn; struct page *buddy; bool to_tail; + bool bypass = false; + + trace_android_vh_free_one_page_bypass(page, zone, order, + migratetype, (int)fpi_flags, &bypass); + + if (bypass) + return; VM_BUG_ON(!zone_is_initialized(zone)); VM_BUG_ON_PAGE(page->flags & PAGE_FLAGS_CHECK_AT_PREP, page); @@ -2272,7 +2279,11 @@ static __always_inline struct page * __rmqueue(struct zone *zone, unsigned int order, int migratetype, unsigned int alloc_flags) { - struct page *page; + struct page *page = NULL; + + trace_android_vh_rmqueue_smallest_bypass(&page, zone, order, migratetype); + if (page) + return page; if (IS_ENABLED(CONFIG_CMA)) { /*