diff --git a/drivers/android/vendor_hooks.c b/drivers/android/vendor_hooks.c index c2af4cefe2f6..37aa4bba1726 100644 --- a/drivers/android/vendor_hooks.c +++ b/drivers/android/vendor_hooks.c @@ -307,3 +307,5 @@ EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_init_aes_encrypt); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_skip_swap_map_write); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_post_image_save); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_madvise_cold_pageout_skip); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_rmqueue_smallest_bypass); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_free_one_page_bypass); diff --git a/include/trace/hooks/mm.h b/include/trace/hooks/mm.h index fb0bc38380fa..cf27ab461c4e 100644 --- a/include/trace/hooks/mm.h +++ b/include/trace/hooks/mm.h @@ -122,6 +122,13 @@ DECLARE_HOOK(android_vh_mem_cgroup_css_online, DECLARE_HOOK(android_vh_mem_cgroup_css_offline, TP_PROTO(struct cgroup_subsys_state *css, struct mem_cgroup *memcg), TP_ARGS(css, memcg)); +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)); #endif /* _TRACE_HOOK_MM_H */ diff --git a/mm/page_alloc.c b/mm/page_alloc.c index 856b0009b21f..c6358579527e 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c @@ -1141,6 +1141,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); @@ -3129,7 +3136,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; retry: page = __rmqueue_smallest(zone, order, migratetype);