diff --git a/drivers/android/vendor_hooks.c b/drivers/android/vendor_hooks.c index 1d580d39c52a..dc44c5d486c8 100644 --- a/drivers/android/vendor_hooks.c +++ b/drivers/android/vendor_hooks.c @@ -451,4 +451,6 @@ EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_mm_kcompactd_cpu_online); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_direct_reclaim_begin); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_direct_reclaim_end); EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_do_read_fault); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_alloc_pages_reclaim_start); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_alloc_pages_reclaim_cycle_end); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_bd_link_disk_holder); diff --git a/include/trace/hooks/mm.h b/include/trace/hooks/mm.h index 777f294c9e3a..25446c7ff5fa 100644 --- a/include/trace/hooks/mm.h +++ b/include/trace/hooks/mm.h @@ -399,7 +399,15 @@ DECLARE_HOOK(android_vh_customize_alloc_gfp, DECLARE_HOOK(android_vh_mm_kcompactd_cpu_online, TP_PROTO(int cpu), TP_ARGS(cpu)); - +DECLARE_HOOK(android_rvh_alloc_pages_reclaim_start, + TP_PROTO(gfp_t gfp_mask, int order, int *alloc_flags), + TP_ARGS(gfp_mask, order, alloc_flags)); +DECLARE_HOOK(android_rvh_alloc_pages_reclaim_cycle_end, + TP_PROTO(gfp_t gfp_mask, int order, int *alloc_flags, + unsigned long *did_some_progress, int *no_progress_loops, + unsigned long direct_reclaim_retries), + TP_ARGS(gfp_mask, order, alloc_flags, did_some_progress, + no_progress_loops, direct_reclaim_retries)); #endif /* _TRACE_HOOK_MM_H */ /* This part must be outside protection */ diff --git a/mm/page_alloc.c b/mm/page_alloc.c index cdf7acc48ea9..a2ef6094b531 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c @@ -4560,6 +4560,7 @@ __alloc_pages_slowpath(gfp_t gfp_mask, unsigned int order, int retry_loop_count = 0; u64 stime = 0; bool should_alloc_retry = false; + unsigned long direct_reclaim_retries = 0; if (unlikely(nofail)) { /* @@ -4622,6 +4623,9 @@ restart: if (alloc_flags & ALLOC_KSWAPD) wake_all_kswapds(order, gfp_mask, ac); + if (can_direct_reclaim && !direct_reclaim_retries && !(current->flags & PF_MEMALLOC)) + trace_android_rvh_alloc_pages_reclaim_start(gfp_mask, order, &alloc_flags); + /* * The adjusted alloc_flags might result in immediate success, so try * that first @@ -4731,6 +4735,9 @@ retry: if (page) goto got_pg; + if (direct_reclaim_retries < ULONG_MAX) + direct_reclaim_retries++; + /* Try direct reclaim and then allocating */ page = __alloc_pages_direct_reclaim(gfp_mask, order, alloc_flags, ac, &did_some_progress); @@ -4756,6 +4763,9 @@ retry: !(gfp_mask & __GFP_RETRY_MAYFAIL))) goto nopage; + trace_android_rvh_alloc_pages_reclaim_cycle_end(gfp_mask, order, + &alloc_flags, &did_some_progress, &no_progress_loops, direct_reclaim_retries); + if (should_reclaim_retry(gfp_mask, order, ac, alloc_flags, did_some_progress > 0, &no_progress_loops)) goto retry;