From d1ba6f2de73e9dc1666a3d885f7d9c684c074c0b Mon Sep 17 00:00:00 2001 From: Liujie Xie Date: Tue, 22 Feb 2022 19:29:53 +0800 Subject: [PATCH] ANDROID: vendor_hooks: Add hooks for __alloc_pages_direct_reclaim Provide a vendor hook to allow drain_all_pages to be skipped during direct reclaim in some cases to avoid delays caused by it in cases when the benefits of draining pcp lists are known to be small. Bug: 220811627 Bug: 234405962 Signed-off-by: Liujie Xie Change-Id: I0805241f81e0a94afcf62c98e97cff125d4061e2 --- drivers/android/vendor_hooks.c | 1 + include/trace/hooks/mm.h | 5 +++++ mm/page_alloc.c | 7 ++++++- 3 files changed, 12 insertions(+), 1 deletion(-) 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; }