From 6f98ceb35884d546d24f8b643bb781a0f523ca1e Mon Sep 17 00:00:00 2001 From: Liujie Xie Date: Wed, 23 Feb 2022 10:32:01 +0800 Subject: [PATCH] ANDROID: vendor_hooks: Add hooks for shrink_active_list Provide a vendor hook to allow page_referenced to be skipped during shrink_active_list to avoid heavy cpuloading caused by it. Bug: 220878851 Bug: 234405962 Signed-off-by: Liujie Xie Signed-off-by: Peifeng Li Change-Id: Ie0e369f8f8739fea59a95470af20ab0e976869d1 --- drivers/android/vendor_hooks.c | 1 + include/trace/hooks/vmscan.h | 4 ++++ mm/vmscan.c | 7 ++++++- 3 files changed, 11 insertions(+), 1 deletion(-) diff --git a/drivers/android/vendor_hooks.c b/drivers/android/vendor_hooks.c index 8b016726700c..e052e89bc76b 100644 --- a/drivers/android/vendor_hooks.c +++ b/drivers/android/vendor_hooks.c @@ -209,6 +209,7 @@ EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_check_preempt_wakeup); 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_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/vmscan.h b/include/trace/hooks/vmscan.h index 6cba5fd70e8a..26e87d8f8e12 100644 --- a/include/trace/hooks/vmscan.h +++ b/include/trace/hooks/vmscan.h @@ -15,6 +15,10 @@ DECLARE_RESTRICTED_HOOK(android_rvh_set_balance_anon_file_reclaim, DECLARE_HOOK(android_vh_kswapd_per_node, TP_PROTO(int nid, bool *skip, bool run), TP_ARGS(nid, skip, run)); +DECLARE_HOOK(android_vh_page_referenced_check_bypass, + TP_PROTO(struct page *page, unsigned long nr_to_scan, int lru, bool *bypass), + TP_ARGS(page, nr_to_scan, lru, bypass)); + #endif /* _TRACE_HOOK_VMSCAN_H */ /* This part must be outside protection */ #include diff --git a/mm/vmscan.c b/mm/vmscan.c index c6585720ca9d..61093dde1153 100644 --- a/mm/vmscan.c +++ b/mm/vmscan.c @@ -2377,6 +2377,7 @@ static void shrink_active_list(unsigned long nr_to_scan, unsigned nr_rotated = 0; int file = is_file_lru(lru); struct pglist_data *pgdat = lruvec_pgdat(lruvec); + bool bypass = false; lru_add_drain(); @@ -2411,6 +2412,10 @@ static void shrink_active_list(unsigned long nr_to_scan, } } + trace_android_vh_page_referenced_check_bypass(page, nr_to_scan, lru, &bypass); + if (bypass) + goto skip_page_referenced; + if (page_referenced(page, 0, sc->target_mem_cgroup, &vm_flags)) { /* @@ -2428,7 +2433,7 @@ static void shrink_active_list(unsigned long nr_to_scan, continue; } } - +skip_page_referenced: ClearPageActive(page); /* we are de-activating */ SetPageWorkingset(page); list_add(&page->lru, &l_inactive);