From 2189ba4dcc0bd1b7d431f31f55744979ef9e8496 Mon Sep 17 00:00:00 2001 From: Yuxuan Yan Date: Thu, 20 Jun 2024 14:44:17 +0800 Subject: [PATCH] ANDROID: GKI: add vendor hooks android_vh_page_should_be_protected() and android_vh_page_referenced_check_bypass(). add two vendor hooks: android_vh_page_should_be_protected():protect pages from memory reclaim. android_vh_page_referenced_check_bypass():bypass rmap in active list shrink. The new vendor data field in scan_control are used to track how many pages are protected in current reclaim and the "protected / scanned" rate. These parameters are useful for understanding the impact of page protection operations on LRU and reclaim, helping us make better decsions. Bug: 399782297 Change-Id: I49567a4b1f978821a94da0a8339b2b8fdfd52daf Signed-off-by: Yuxuan Yan --- drivers/android/vendor_hooks.c | 2 ++ include/trace/hooks/mm.h | 4 ++++ include/trace/hooks/vmscan.h | 3 +++ mm/vmscan.c | 21 +++++++++++++++++++++ 4 files changed, 30 insertions(+) diff --git a/drivers/android/vendor_hooks.c b/drivers/android/vendor_hooks.c index cd2b2f4b32d1..85f7e89aea4c 100644 --- a/drivers/android/vendor_hooks.c +++ b/drivers/android/vendor_hooks.c @@ -354,6 +354,8 @@ EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_madvise_pageout_bypass); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_free_pages_prepare_bypass); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_free_pages_ok_bypass); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_split_large_folio_bypass); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_page_should_be_protected); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_page_referenced_check_bypass); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_do_read_fault); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_filemap_read); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_filemap_map_pages); diff --git a/include/trace/hooks/mm.h b/include/trace/hooks/mm.h index 8cb47aa66b0a..fdc654b57cf9 100644 --- a/include/trace/hooks/mm.h +++ b/include/trace/hooks/mm.h @@ -235,6 +235,10 @@ DECLARE_HOOK(android_vh_free_pages_ok_bypass, DECLARE_HOOK(android_vh_split_large_folio_bypass, TP_PROTO(bool *bypass), TP_ARGS(bypass)); +DECLARE_HOOK(android_vh_page_should_be_protected, + TP_PROTO(struct folio *folio, unsigned long nr_scanned, + s8 priority, u64 *ext, int *should_protect), + TP_ARGS(folio, nr_scanned, priority, ext, should_protect)); DECLARE_HOOK(android_vh_do_read_fault, TP_PROTO(struct vm_fault *vmf, unsigned long fault_around_bytes), TP_ARGS(vmf, fault_around_bytes)); diff --git a/include/trace/hooks/vmscan.h b/include/trace/hooks/vmscan.h index 733648c28a56..54161cf847b2 100644 --- a/include/trace/hooks/vmscan.h +++ b/include/trace/hooks/vmscan.h @@ -49,6 +49,9 @@ DECLARE_HOOK(android_vh_use_vm_swappiness, DECLARE_HOOK(android_vh_tune_scan_control, TP_PROTO(bool *skip_swap), TP_ARGS(skip_swap)); +DECLARE_HOOK(android_vh_page_referenced_check_bypass, + TP_PROTO(struct folio *folio, unsigned long nr_to_scan, int lru, bool *bypass), + TP_ARGS(folio, 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 3c5026ae7594..afefefc7c9de 100644 --- a/mm/vmscan.c +++ b/mm/vmscan.c @@ -876,6 +876,10 @@ static enum folio_references folio_check_references(struct folio *folio, unsigned long vm_flags; int ret = 0; +#ifdef CONFIG_ANDROID_VENDOR_OEM_DATA + trace_android_vh_page_should_be_protected(folio, sc->nr_scanned, + sc->priority, &sc->android_vendor_data1, &ret); +#endif trace_android_vh_check_folio_look_around_ref(folio, &ret); if (ret) return ret; @@ -2070,6 +2074,8 @@ static void shrink_active_list(unsigned long nr_to_scan, unsigned nr_rotated = 0; bool file = is_file_lru(lru); struct pglist_data *pgdat = lruvec_pgdat(lruvec); + int should_protect = 0; + bool bypass = false; lru_add_drain(); @@ -2106,6 +2112,20 @@ static void shrink_active_list(unsigned long nr_to_scan, } } +#ifdef CONFIG_ANDROID_VENDOR_OEM_DATA + trace_android_vh_page_should_be_protected(folio, sc->nr_scanned, + sc->priority, &sc->android_vendor_data1, &should_protect); +#endif + if (unlikely(should_protect)) { + nr_rotated += folio_nr_pages(folio); + list_add(&folio->lru, &l_active); + continue; + } + + trace_android_vh_page_referenced_check_bypass(folio, nr_to_scan, lru, &bypass); + if (bypass) + goto skip_folio_referenced; + /* Referenced or rmap lock contention: rotate */ if (folio_referenced(folio, 0, sc->target_mem_cgroup, &vm_flags) != 0) { @@ -2125,6 +2145,7 @@ static void shrink_active_list(unsigned long nr_to_scan, } } +skip_folio_referenced: folio_clear_active(folio); /* we are de-activating */ folio_set_workingset(folio); list_add(&folio->lru, &l_inactive);