diff --git a/drivers/android/vendor_hooks.c b/drivers/android/vendor_hooks.c index 253f2ce82192..f8d55c68584c 100644 --- a/drivers/android/vendor_hooks.c +++ b/drivers/android/vendor_hooks.c @@ -291,6 +291,7 @@ EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_logbuf_pr_cont); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_tune_scan_type); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_tune_swappiness); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_shrink_slab_bypass); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_page_referenced_check_bypass); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_psi_event); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_psi_group); EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_cpuset_fork); diff --git a/include/trace/hooks/vmscan.h b/include/trace/hooks/vmscan.h index ecbff00093ee..95fb17af29e8 100644 --- a/include/trace/hooks/vmscan.h +++ b/include/trace/hooks/vmscan.h @@ -25,6 +25,10 @@ DECLARE_HOOK(android_vh_tune_inactive_ratio, DECLARE_RESTRICTED_HOOK(android_rvh_set_balance_anon_file_reclaim, TP_PROTO(bool *balance_anon_file_reclaim), TP_ARGS(balance_anon_file_reclaim), 1); +DECLARE_HOOK(android_vh_page_referenced_check_bypass, + TP_PROTO(struct page *page, unsigned long nr_to_scan, int lru, bool *bypass), + TP_ARGS(page, 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 3f5a834dd764..46d8e65071d8 100644 --- a/mm/vmscan.c +++ b/mm/vmscan.c @@ -2083,6 +2083,7 @@ static void shrink_active_list(unsigned long nr_to_scan, unsigned nr_rotated = 0; int file = is_file_lru(lru); struct pglist_data *pgdat = lruvec_pgdat(lruvec); + bool bypass = false; lru_add_drain(); @@ -2117,6 +2118,10 @@ static void shrink_active_list(unsigned long nr_to_scan, } } + trace_android_vh_page_referenced_check_bypass(page, nr_to_scan, lru, &bypass); + if (bypass) + goto skip_page_referenced; + if (page_referenced(page, 0, sc->target_mem_cgroup, &vm_flags)) { /* @@ -2134,7 +2139,7 @@ static void shrink_active_list(unsigned long nr_to_scan, continue; } } - +skip_page_referenced: ClearPageActive(page); /* we are de-activating */ SetPageWorkingset(page); list_add(&page->lru, &l_inactive);