diff --git a/drivers/android/vendor_hooks.c b/drivers/android/vendor_hooks.c index 150d841da5ce..945b551621a5 100644 --- a/drivers/android/vendor_hooks.c +++ b/drivers/android/vendor_hooks.c @@ -521,3 +521,4 @@ 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); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_calculate_totalreserve_pages); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_madvise_cold_pageout_skip); diff --git a/include/trace/hooks/mm.h b/include/trace/hooks/mm.h index cfc8346ebd19..92439e137ab0 100644 --- a/include/trace/hooks/mm.h +++ b/include/trace/hooks/mm.h @@ -49,6 +49,9 @@ DECLARE_RESTRICTED_HOOK(android_rvh_bitmap_find_best_next_area, bool status), TP_ARGS(bitmap, bitmap_maxno, start, bitmap_count, mask, offset, bitmap_no, status), 1); +DECLARE_HOOK(android_vh_madvise_cold_pageout_skip, + TP_PROTO(struct vm_area_struct *vma, struct folio *folio, bool pageout, bool *need_skip), + TP_ARGS(vma, folio, pageout, need_skip)); /* DECLARE_RESTRICTED_HOOK(android_rvh_set_skip_swapcache_flags, diff --git a/mm/madvise.c b/mm/madvise.c index 6a4d7a578b30..9798fcfda6c8 100644 --- a/mm/madvise.c +++ b/mm/madvise.c @@ -447,6 +447,7 @@ restart: flush_tlb_batched_pending(mm); arch_enter_lazy_mmu_mode(); for (; addr < end; pte += nr, addr += nr * PAGE_SIZE) { + bool need_skip = false; nr = 1; ptent = ptep_get(pte); @@ -470,6 +471,12 @@ restart: if (!folio || folio_is_zone_device(folio)) continue; + trace_android_vh_madvise_cold_pageout_skip(vma, folio, pageout, + &need_skip); + + if (need_skip) + continue; + /* * If we encounter a large folio, only split it if it is not * fully mapped within the range we are operating on. Otherwise