From 081bb422e2d869d0bac6447839973b31a19f95c1 Mon Sep 17 00:00:00 2001 From: Qianfeng Rong Date: Wed, 12 Mar 2025 17:10:57 +0800 Subject: [PATCH] ANDROID: vendor hooks: Add hooks to abort scan memcgs The more memcg groups there are, the longer a single traversal takes, resulting in poor consistency in memory recycling time. It is possible to interrupt memcg traversal recycling to speed up memory application for some important processes. Bug: 402041892 Change-Id: I8b9a0cce754cb07babe0ce234fbf262b20f9d020 Signed-off-by: Qianfeng Rong --- drivers/android/vendor_hooks.c | 1 + include/trace/hooks/vmscan.h | 7 +++++++ mm/vmscan.c | 9 ++++++++- 3 files changed, 16 insertions(+), 1 deletion(-) diff --git a/drivers/android/vendor_hooks.c b/drivers/android/vendor_hooks.c index 253b5b247964..ef8da5cc4c7c 100644 --- a/drivers/android/vendor_hooks.c +++ b/drivers/android/vendor_hooks.c @@ -238,6 +238,7 @@ EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_oom_check_panic); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_rmqueue_smallest_bypass); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_free_one_page_bypass); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_migration_target_bypass); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_shrink_node_memcgs_bypass); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_adjust_alloc_flags); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_tune_scan_type); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_binder_wait_for_work); diff --git a/include/trace/hooks/vmscan.h b/include/trace/hooks/vmscan.h index b16e2dd323fa..97329e5f81cb 100644 --- a/include/trace/hooks/vmscan.h +++ b/include/trace/hooks/vmscan.h @@ -9,6 +9,8 @@ #include +struct mem_cgroup_reclaim_cookie; + DECLARE_RESTRICTED_HOOK(android_rvh_set_balance_anon_file_reclaim, TP_PROTO(bool *balance_anon_file_reclaim), TP_ARGS(balance_anon_file_reclaim), 1); @@ -34,6 +36,11 @@ DECLARE_HOOK(android_vh_mglru_should_abort_scan, TP_PROTO(unsigned long nr_reclaimed, unsigned long nr_to_reclaim, unsigned int order, bool *bypass), TP_ARGS(nr_to_reclaim, nr_reclaimed, order, bypass)); +DECLARE_HOOK(android_vh_shrink_node_memcgs_bypass, + TP_PROTO(u64 *ext, struct mem_cgroup_reclaim_cookie *partial, + unsigned long nr_to_reclaim, unsigned long nr_reclaimed, + gfp_t gfp_mask, int order, bool *bypass), + TP_ARGS(ext, partial, nr_to_reclaim, nr_reclaimed, gfp_mask, order, bypass)); DECLARE_HOOK(android_vh_should_memcg_bypass, TP_PROTO(struct mem_cgroup *memcg, int priority, bool *bypass), TP_ARGS(memcg, priority, bypass)); diff --git a/mm/vmscan.c b/mm/vmscan.c index 73b03c34cf77..ec8eed87e372 100644 --- a/mm/vmscan.c +++ b/mm/vmscan.c @@ -5969,6 +5969,7 @@ static void shrink_node_memcgs(pg_data_t *pgdat, struct scan_control *sc) struct lruvec *lruvec = mem_cgroup_lruvec(memcg, pgdat); unsigned long reclaimed; unsigned long scanned; + bool bypass = false; /* * This loop can become CPU-bound when target memcgs @@ -6014,8 +6015,14 @@ static void shrink_node_memcgs(pg_data_t *pgdat, struct scan_control *sc) sc->nr_scanned - scanned, sc->nr_reclaimed - reclaimed); +#ifdef CONFIG_ANDROID_VENDOR_OEM_DATA + trace_android_vh_shrink_node_memcgs_bypass(&sc->android_vendor_data1, + partial, sc->nr_to_reclaim, sc->nr_reclaimed, + sc->gfp_mask, sc->order, &bypass); +#endif + /* If partial walks are allowed, bail once goal is reached */ - if (partial && sc->nr_reclaimed >= sc->nr_to_reclaim) { + if (bypass || (partial && sc->nr_reclaimed >= sc->nr_to_reclaim)) { mem_cgroup_iter_break(target_memcg, memcg); break; }