From 370f686ecb0669885c0bbbdcccf920b1e5011af0 Mon Sep 17 00:00:00 2001 From: JohnHsu Date: Mon, 25 Sep 2023 16:57:06 +0800 Subject: [PATCH] ANDROID: mm: Add vendor hooks for __alloc_pages_slowpath To monitor the efficiency of memory relciaming in __alloc_pages_slowpath, add vendor hooks in each stages of __alloc_pages_slowpath including __alloc_pages_may_oom and __alloc_pages_direct_reclaim. android_vh_mm_direct_reclaim_enter() android_vh_mm_direct_reclaim_exit(unsigned long, int) android_vh_mm_may_oom_exit(struct oom_control *, unsigned long) Bug: 301044280 Bug: 330661608 Bug: 411525596 Change-Id: Ic5b5f1c2ad31b16e7339f539fcf54659e9acaba7 Signed-off-by: John Hsu Signed-off-by: Chinwen Chang --- drivers/android/vendor_hooks.c | 3 +++ include/trace/hooks/mm.h | 11 ++++++++++- mm/page_alloc.c | 7 ++++++- 3 files changed, 19 insertions(+), 2 deletions(-) diff --git a/drivers/android/vendor_hooks.c b/drivers/android/vendor_hooks.c index 4d2442193033..0d8c43e1138e 100644 --- a/drivers/android/vendor_hooks.c +++ b/drivers/android/vendor_hooks.c @@ -498,3 +498,6 @@ EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_clear_rwsem_writer_owned); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_rwsem_read_trylock_failed); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_compaction_exit); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_compaction_try_to_compact_exit); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_mm_direct_reclaim_enter); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_mm_direct_reclaim_exit); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_mm_may_oom_exit); diff --git a/include/trace/hooks/mm.h b/include/trace/hooks/mm.h index 3e1436729ff4..b3454f626d36 100644 --- a/include/trace/hooks/mm.h +++ b/include/trace/hooks/mm.h @@ -434,7 +434,16 @@ DECLARE_HOOK(android_vh_filemap_update_page, TP_PROTO(struct address_space *mapping, struct folio *folio, struct file *file), TP_ARGS(mapping, folio, file)); - +DECLARE_HOOK(android_vh_mm_direct_reclaim_enter, + TP_PROTO(unsigned int order), + TP_ARGS(order)); +DECLARE_HOOK(android_vh_mm_direct_reclaim_exit, + TP_PROTO(unsigned long did_some_progress, int retry_times), + TP_ARGS(did_some_progress, retry_times)); +struct oom_control; +DECLARE_HOOK(android_vh_mm_may_oom_exit, + TP_PROTO(struct oom_control *oc, unsigned long did_some_progress), + TP_ARGS(oc, did_some_progress)); #endif /* _TRACE_HOOK_MM_H */ /* This part must be outside protection */ diff --git a/mm/page_alloc.c b/mm/page_alloc.c index 0d653be05eca..16dbe2b33aa7 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c @@ -3925,6 +3925,7 @@ __alloc_pages_may_oom(gfp_t gfp_mask, unsigned int order, if (!mutex_trylock(&oom_lock)) { *did_some_progress = 1; schedule_timeout_uninterruptible(1); + trace_android_vh_mm_may_oom_exit(&oc, *did_some_progress); return NULL; } @@ -3987,6 +3988,7 @@ __alloc_pages_may_oom(gfp_t gfp_mask, unsigned int order, } out: mutex_unlock(&oom_lock); + trace_android_vh_mm_may_oom_exit(&oc, *did_some_progress); return page; } @@ -4275,11 +4277,13 @@ __alloc_pages_direct_reclaim(gfp_t gfp_mask, unsigned int order, unsigned int alloc_flags, const struct alloc_context *ac, unsigned long *did_some_progress) { + int retry_times = 0; struct page *page = NULL; unsigned long pflags; bool drained = false; bool skip_pcp_drain = false; + trace_android_vh_mm_direct_reclaim_enter(order); psi_memstall_enter(&pflags); *did_some_progress = __perform_reclaim(gfp_mask, order, ac); if (unlikely(!(*did_some_progress))) @@ -4300,11 +4304,12 @@ retry: if (!skip_pcp_drain) drain_all_pages(NULL); drained = true; + ++retry_times; goto retry; } out: psi_memstall_leave(&pflags); - + trace_android_vh_mm_direct_reclaim_exit(*did_some_progress, retry_times); return page; }