diff --git a/drivers/android/vendor_hooks.c b/drivers/android/vendor_hooks.c index c5ce9d0a1b72..c6e334d3d0ed 100644 --- a/drivers/android/vendor_hooks.c +++ b/drivers/android/vendor_hooks.c @@ -284,3 +284,6 @@ EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_get_thermal_zone_device); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_thermal_power_cap); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_alloc_pages_reclaim_bypass); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_alloc_pages_failure_bypass); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_madvise_pageout_swap_entry); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_madvise_swapin_walk_pmd_entry); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_process_madvise_end); diff --git a/include/trace/hooks/mm.h b/include/trace/hooks/mm.h index 6c9e37e87ff6..3695f42143ca 100644 --- a/include/trace/hooks/mm.h +++ b/include/trace/hooks/mm.h @@ -64,16 +64,23 @@ struct slabinfo; DECLARE_HOOK(android_vh_cache_show, TP_PROTO(struct seq_file *m, struct slabinfo *sinfo, struct kmem_cache *s), TP_ARGS(m, sinfo, s)); - DECLARE_HOOK(android_vh_alloc_pages_reclaim_bypass, TP_PROTO(gfp_t gfp_mask, int order, int alloc_flags, int migratetype, struct page **page), TP_ARGS(gfp_mask, order, alloc_flags, migratetype, page)); - DECLARE_HOOK(android_vh_alloc_pages_failure_bypass, TP_PROTO(gfp_t gfp_mask, int order, int alloc_flags, int migratetype, struct page **page), TP_ARGS(gfp_mask, order, alloc_flags, migratetype, page)); +DECLARE_HOOK(android_vh_madvise_pageout_swap_entry, + TP_PROTO(swp_entry_t entry, int swapcount), + TP_ARGS(entry, swapcount)); +DECLARE_HOOK(android_vh_madvise_swapin_walk_pmd_entry, + TP_PROTO(swp_entry_t entry), + TP_ARGS(entry)); +DECLARE_HOOK(android_vh_process_madvise_end, + TP_PROTO(int behavior, ssize_t *ret), + TP_ARGS(behavior, ret)); #endif /* _TRACE_HOOK_MM_H */ diff --git a/mm/madvise.c b/mm/madvise.c index 621b25214336..898f46899a1d 100644 --- a/mm/madvise.c +++ b/mm/madvise.c @@ -31,6 +31,7 @@ #include #include #include +#include #include @@ -219,6 +220,7 @@ static int swapin_walk_pmd_entry(pmd_t *pmd, unsigned long start, entry = pte_to_swp_entry(pte); if (unlikely(non_swap_entry(entry))) continue; + trace_android_vh_madvise_swapin_walk_pmd_entry(entry); page = read_swap_cache_async(entry, GFP_HIGHUSER_MOVABLE, vma, index, false, &splug); @@ -350,6 +352,7 @@ static int madvise_cold_or_pageout_pte_range(pmd_t *pmd, struct page *page = NULL; LIST_HEAD(page_list); bool pageout_anon_only_filter; + swp_entry_t entry; if (fatal_signal_pending(current)) return -EINTR; @@ -440,8 +443,12 @@ regular_page: if (pte_none(ptent)) continue; - if (!pte_present(ptent)) + if (!pte_present(ptent)) { + entry = pte_to_swp_entry(ptent); + trace_android_vh_madvise_pageout_swap_entry(entry, + swp_swapcount(entry)); continue; + } page = vm_normal_page(vma, addr, ptent); if (!page || is_zone_device_page(page)) @@ -1518,6 +1525,7 @@ SYSCALL_DEFINE5(process_madvise, int, pidfd, const struct iovec __user *, vec, iov_iter_advance(&iter, iovec.iov_len); } + trace_android_vh_process_madvise_end(behavior, &ret); ret = (total_len - iov_iter_count(&iter)) ? : ret; release_mm: