diff --git a/drivers/android/vendor_hooks.c b/drivers/android/vendor_hooks.c index ebf5c1c0e7a1..7cb794211f29 100644 --- a/drivers/android/vendor_hooks.c +++ b/drivers/android/vendor_hooks.c @@ -444,6 +444,8 @@ EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_folio_trylock_clear); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_folio_trylock_set); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_handle_trylock_failed_folio); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_hibernate_state); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_page_should_be_protected); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_page_referenced_check_bypass); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_swapmem_gather_init); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_swapmem_gather_add_bypass); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_swapmem_gather_finish); diff --git a/include/trace/hooks/mm.h b/include/trace/hooks/mm.h index 930fb08e91d5..776ede13ae0c 100644 --- a/include/trace/hooks/mm.h +++ b/include/trace/hooks/mm.h @@ -252,6 +252,11 @@ DECLARE_HOOK(android_vh_shmem_swapin_folio, DECLARE_HOOK(android_vh_madvise_cold_or_pageout_page, TP_PROTO(bool pageout, struct page *page), TP_ARGS(pageout, page)); +DECLARE_HOOK(android_vh_page_should_be_protected, + TP_PROTO(struct folio *folio, unsigned long nr_scanned, + s8 priority, u64 *ext, int *should_protect), + TP_ARGS(folio, nr_scanned, priority, ext, should_protect)); + DECLARE_HOOK(android_vh_swapmem_gather_init, TP_PROTO(struct mm_struct *mm), TP_ARGS(mm)); diff --git a/include/trace/hooks/vmscan.h b/include/trace/hooks/vmscan.h index 0c5385bdb175..369a2c596376 100644 --- a/include/trace/hooks/vmscan.h +++ b/include/trace/hooks/vmscan.h @@ -69,6 +69,9 @@ DECLARE_HOOK(android_vh_do_folio_trylock, TP_PROTO(struct folio *folio, struct rw_semaphore *sem, bool *got_lock, bool *skip), TP_ARGS(folio, sem, got_lock, skip)); +DECLARE_HOOK(android_vh_page_referenced_check_bypass, + TP_PROTO(struct folio *folio, unsigned long nr_to_scan, int lru, bool *bypass), + TP_ARGS(folio, 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 2308399473ad..777662967d99 100644 --- a/mm/vmscan.c +++ b/mm/vmscan.c @@ -1480,6 +1480,10 @@ static enum folio_references folio_check_references(struct folio *folio, int ret = 0; bool trylock_failed = false; +#ifdef CONFIG_ANDROID_VENDOR_OEM_DATA + trace_android_vh_page_should_be_protected(folio, sc->nr_scanned, + sc->priority, &sc->android_vendor_data1, &ret); +#endif trace_android_vh_check_folio_look_around_ref(folio, &ret); if (ret) return ret; @@ -2649,6 +2653,8 @@ 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); + int should_protect = 0; + bool bypass = false; lru_add_drain(); @@ -2685,6 +2691,19 @@ static void shrink_active_list(unsigned long nr_to_scan, } } +#ifdef CONFIG_ANDROID_VENDOR_OEM_DATA + trace_android_vh_page_should_be_protected(folio, sc->nr_scanned, + sc->priority, &sc->android_vendor_data1, &should_protect); +#endif + if (unlikely(should_protect)) { + nr_rotated += folio_nr_pages(folio); + list_add(&folio->lru, &l_active); + continue; + } + + trace_android_vh_page_referenced_check_bypass(folio, nr_to_scan, lru, &bypass); + if (bypass) + goto skip_folio_referenced; trace_android_vh_folio_trylock_set(folio); /* Referenced or rmap lock contention: rotate */ if (folio_referenced(folio, 0, sc->target_mem_cgroup, @@ -2706,6 +2725,7 @@ static void shrink_active_list(unsigned long nr_to_scan, } } trace_android_vh_folio_trylock_clear(folio); +skip_folio_referenced: folio_clear_active(folio); /* we are de-activating */ folio_set_workingset(folio); list_add(&folio->lru, &l_inactive);