diff --git a/drivers/android/vendor_hooks.c b/drivers/android/vendor_hooks.c index e10e8fdde8a2..9248ec555147 100644 --- a/drivers/android/vendor_hooks.c +++ b/drivers/android/vendor_hooks.c @@ -337,3 +337,6 @@ EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_madvise_pageout_bypass); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_free_pages_prepare_bypass); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_free_pages_ok_bypass); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_split_large_folio_bypass); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_do_read_fault); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_filemap_read); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_filemap_map_pages); diff --git a/include/trace/hooks/mm.h b/include/trace/hooks/mm.h index bca20c9e2cc0..775bf6294d19 100644 --- a/include/trace/hooks/mm.h +++ b/include/trace/hooks/mm.h @@ -217,6 +217,16 @@ DECLARE_HOOK(android_vh_free_pages_ok_bypass, DECLARE_HOOK(android_vh_split_large_folio_bypass, TP_PROTO(bool *bypass), TP_ARGS(bypass)); +DECLARE_HOOK(android_vh_do_read_fault, + TP_PROTO(struct vm_fault *vmf, unsigned long fault_around_bytes), + TP_ARGS(vmf, fault_around_bytes)); +DECLARE_HOOK(android_vh_filemap_read, + TP_PROTO(struct file *file, loff_t pos, size_t size), + TP_ARGS(file, pos, size)); +DECLARE_HOOK(android_vh_filemap_map_pages, + TP_PROTO(struct file *file, pgoff_t first_pgoff, + pgoff_t last_pgoff, vm_fault_t ret), + TP_ARGS(file, first_pgoff, last_pgoff, ret)); #endif /* _TRACE_HOOK_MM_H */ /* This part must be outside protection */ diff --git a/mm/filemap.c b/mm/filemap.c index fa23f6f5f59d..0f90852ee199 100644 --- a/mm/filemap.c +++ b/mm/filemap.c @@ -2641,6 +2641,7 @@ ssize_t filemap_read(struct kiocb *iocb, struct iov_iter *iter, iov_iter_truncate(iter, inode->i_sb->s_maxbytes - iocb->ki_pos); folio_batch_init(&fbatch); + trace_android_vh_filemap_read(filp, iocb->ki_pos, iov_iter_count(iter)); do { cond_resched(); @@ -3654,11 +3655,13 @@ vm_fault_t filemap_map_pages(struct vm_fault *vmf, vm_fault_t ret = 0; unsigned long rss = 0; unsigned int nr_pages = 0, mmap_miss = 0, mmap_miss_saved, folio_type; + pgoff_t first_pgoff = 0; rcu_read_lock(); folio = next_uptodate_folio(&xas, mapping, end_pgoff); if (!folio) goto out; + first_pgoff = xas.xa_index; if (filemap_map_pmd(vmf, folio, start_pgoff)) { ret = VM_FAULT_NOPAGE; @@ -3709,6 +3712,7 @@ out: WRITE_ONCE(file->f_ra.mmap_miss, 0); else WRITE_ONCE(file->f_ra.mmap_miss, mmap_miss_saved - mmap_miss); + trace_android_vh_filemap_map_pages(file, first_pgoff, last_pgoff, ret); return ret; } diff --git a/mm/memory.c b/mm/memory.c index 92b7132eacf0..b20a79dc42ba 100644 --- a/mm/memory.c +++ b/mm/memory.c @@ -5297,6 +5297,8 @@ static vm_fault_t do_read_fault(struct vm_fault *vmf) ret = do_fault_around(vmf); if (ret) return ret; + } else { + trace_android_vh_do_read_fault(vmf, fault_around_pages); } ret = vmf_can_call_fault(vmf);