From 8da6ee328b2b789acdcc35dc196d10ff8f8e41bc Mon Sep 17 00:00:00 2001 From: rongqianfeng Date: Fri, 21 May 2021 10:30:14 +0800 Subject: [PATCH] ANDROID: vendor_hooks: add hook and OEM data for slab shrink Some shrinker add lock in count_objects() may cause lock contention issues and lead all task stall on slab shrink. Add vendor hook in do_shrink_slab() for shrinker->count_objects() latency measuring. Add 3 oem data in shrink_control struct. Two is for shrinker->count_objects() and shrinker->scan_objects() latency measuring, other one to store priority, some shrinker know the reclaimer priority can control the memory reclaim more better. Bug: 188684131 Change-Id: I80e9d90179bb52a99c54d9a067c6fcee835bb2ad Signed-off-by: rongqianfeng --- drivers/android/vendor_hooks.c | 1 + include/linux/shrinker.h | 3 +++ include/trace/hooks/vmscan.h | 3 +++ mm/vmscan.c | 2 ++ 4 files changed, 9 insertions(+) diff --git a/drivers/android/vendor_hooks.c b/drivers/android/vendor_hooks.c index df369071d358..26ef5ed8fa8a 100644 --- a/drivers/android/vendor_hooks.c +++ b/drivers/android/vendor_hooks.c @@ -273,6 +273,7 @@ EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_exit_mm); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_alloc_pages_slowpath); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_show_mem); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_print_slabinfo_header); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_do_shrink_slab); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_cache_show); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_setscheduler_uclamp); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_do_wake_up_sync); diff --git a/include/linux/shrinker.h b/include/linux/shrinker.h index 9814fff58a69..45944bae30fc 100644 --- a/include/linux/shrinker.h +++ b/include/linux/shrinker.h @@ -2,6 +2,8 @@ #ifndef _LINUX_SHRINKER_H #define _LINUX_SHRINKER_H +#include + /* * This struct is used to pass information from page reclaim to the shrinkers. * We consolidate the values for easier extension later. @@ -31,6 +33,7 @@ struct shrink_control { /* current memcg being shrunk (for memcg aware shrinkers) */ struct mem_cgroup *memcg; + ANDROID_OEM_DATA_ARRAY(1, 3); }; #define SHRINK_STOP (~0UL) diff --git a/include/trace/hooks/vmscan.h b/include/trace/hooks/vmscan.h index 5abeec9fc06d..de141abe1a29 100644 --- a/include/trace/hooks/vmscan.h +++ b/include/trace/hooks/vmscan.h @@ -25,6 +25,9 @@ DECLARE_HOOK(android_vh_shrink_node_memcgs, DECLARE_HOOK(android_vh_shrink_slab_bypass, TP_PROTO(gfp_t gfp_mask, int nid, struct mem_cgroup *memcg, int priority, bool *bypass), TP_ARGS(gfp_mask, nid, memcg, priority, bypass)); +DECLARE_HOOK(android_vh_do_shrink_slab, + TP_PROTO(struct shrinker *shrinker, struct shrink_control *shrinkctl, int priority), + TP_ARGS(shrinker, shrinkctl, priority)); #endif /* _TRACE_HOOK_VMSCAN_H */ /* This part must be outside protection */ #include diff --git a/mm/vmscan.c b/mm/vmscan.c index de68f2872257..d37724d80bbc 100644 --- a/mm/vmscan.c +++ b/mm/vmscan.c @@ -716,6 +716,8 @@ static unsigned long do_shrink_slab(struct shrink_control *shrinkctl, : SHRINK_BATCH; long scanned = 0, next_deferred; + trace_android_vh_do_shrink_slab(shrinker, shrinkctl, priority); + freeable = shrinker->count_objects(shrinker, shrinkctl); if (freeable == 0 || freeable == SHRINK_EMPTY) return freeable;