diff --git a/drivers/android/vendor_hooks.c b/drivers/android/vendor_hooks.c index e052e89bc76b..da4785ee96f6 100644 --- a/drivers/android/vendor_hooks.c +++ b/drivers/android/vendor_hooks.c @@ -210,6 +210,7 @@ EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_cpufreq_transition); EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_set_balance_anon_file_reclaim); EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_show_max_freq); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_page_referenced_check_bypass); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_drain_all_pages_bypass); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_free_task); EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_after_enqueue_task); EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_after_dequeue_task); diff --git a/include/trace/hooks/mm.h b/include/trace/hooks/mm.h index 9bd5b1414b99..8d19a85e242d 100644 --- a/include/trace/hooks/mm.h +++ b/include/trace/hooks/mm.h @@ -25,6 +25,11 @@ DECLARE_RESTRICTED_HOOK(android_rvh_set_readahead_gfp_mask, DECLARE_HOOK(android_vh_oom_check_panic, TP_PROTO(struct oom_control *oc, int *ret), TP_ARGS(oc, ret)); +DECLARE_HOOK(android_vh_drain_all_pages_bypass, + TP_PROTO(gfp_t gfp_mask, unsigned int order, unsigned long alloc_flags, + int migratetype, unsigned long did_some_progress, + bool *bypass), + TP_ARGS(gfp_mask, order, alloc_flags, migratetype, did_some_progress, bypass)); #endif /* _TRACE_HOOK_MM_H */ diff --git a/mm/page_alloc.c b/mm/page_alloc.c index e6aed2c5ff3f..5c08e0f955e1 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c @@ -72,6 +72,7 @@ #include #include #include +#include #include #include #include @@ -4725,6 +4726,7 @@ __alloc_pages_direct_reclaim(gfp_t gfp_mask, unsigned int order, struct page *page = NULL; unsigned long pflags; bool drained = false; + bool skip_pcp_drain = false; psi_memstall_enter(&pflags); *did_some_progress = __perform_reclaim(gfp_mask, order, ac); @@ -4741,7 +4743,10 @@ retry: */ if (!page && !drained) { unreserve_highatomic_pageblock(ac, false); - drain_all_pages(NULL); + trace_android_vh_drain_all_pages_bypass(gfp_mask, order, + alloc_flags, ac->migratetype, *did_some_progress, &skip_pcp_drain); + if (!skip_pcp_drain) + drain_all_pages(NULL); drained = true; goto retry; }