diff --git a/drivers/android/vendor_hooks.c b/drivers/android/vendor_hooks.c index 3daab3de4cd3..71c39666160c 100644 --- a/drivers/android/vendor_hooks.c +++ b/drivers/android/vendor_hooks.c @@ -341,3 +341,7 @@ 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); EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_try_alloc_pages_gfp); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_page_cache_readahead_start); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_page_cache_readahead_end); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_filemap_fault_start); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_filemap_fault_end); diff --git a/include/trace/hooks/mm.h b/include/trace/hooks/mm.h index 7ec92a88648c..96678366b2a5 100644 --- a/include/trace/hooks/mm.h +++ b/include/trace/hooks/mm.h @@ -231,6 +231,19 @@ 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)); +DECLARE_HOOK(android_vh_page_cache_readahead_start, + TP_PROTO(struct file *file, pgoff_t pgoff, + unsigned int size, bool sync), + TP_ARGS(file, pgoff, size, sync)); +DECLARE_HOOK(android_vh_page_cache_readahead_end, + TP_PROTO(struct file *file, pgoff_t pgoff), + TP_ARGS(file, pgoff)); +DECLARE_HOOK(android_vh_filemap_fault_start, + TP_PROTO(struct file *file, pgoff_t pgoff), + TP_ARGS(file, pgoff)); +DECLARE_HOOK(android_vh_filemap_fault_end, + TP_PROTO(struct file *file, pgoff_t pgoff), + TP_ARGS(file, pgoff)); #endif /* _TRACE_HOOK_MM_H */ /* This part must be outside protection */ diff --git a/mm/filemap.c b/mm/filemap.c index 0f90852ee199..b30a8466de59 100644 --- a/mm/filemap.c +++ b/mm/filemap.c @@ -3190,7 +3190,10 @@ static struct file *do_sync_mmap_readahead(struct vm_fault *vmf) if (vm_flags & VM_SEQ_READ) { fpin = maybe_unlock_mmap_for_io(vmf, fpin); + trace_android_vh_page_cache_readahead_start(file, vmf->pgoff, + ra->ra_pages, true); page_cache_sync_ra(&ractl, ra->ra_pages); + trace_android_vh_page_cache_readahead_end(file, vmf->pgoff); return fpin; } @@ -3214,7 +3217,10 @@ static struct file *do_sync_mmap_readahead(struct vm_fault *vmf) ra->size = ra->ra_pages; ra->async_size = ra->ra_pages / 4; ractl._index = ra->start; + trace_android_vh_page_cache_readahead_start(file, vmf->pgoff, + ra->size, true); page_cache_ra_order(&ractl, ra, 0); + trace_android_vh_page_cache_readahead_end(file, vmf->pgoff); return fpin; } @@ -3242,7 +3248,10 @@ static struct file *do_async_mmap_readahead(struct vm_fault *vmf, if (folio_test_readahead(folio)) { fpin = maybe_unlock_mmap_for_io(vmf, fpin); + trace_android_vh_page_cache_readahead_start(file, vmf->pgoff, + ra->ra_pages, false); page_cache_async_ra(&ractl, folio, ra->ra_pages); + trace_android_vh_page_cache_readahead_end(file, vmf->pgoff); } return fpin; } @@ -3447,7 +3456,9 @@ page_not_uptodate: * and we need to check for errors. */ fpin = maybe_unlock_mmap_for_io(vmf, fpin); + trace_android_vh_filemap_fault_start(file, vmf->pgoff); error = filemap_read_folio(file, mapping->a_ops->read_folio, folio); + trace_android_vh_filemap_fault_end(file, vmf->pgoff); if (fpin) goto out_retry; folio_put(folio);