diff --git a/drivers/android/vendor_hooks.c b/drivers/android/vendor_hooks.c index 9829d2b783f5..aa21aa87ef67 100644 --- a/drivers/android/vendor_hooks.c +++ b/drivers/android/vendor_hooks.c @@ -193,6 +193,8 @@ EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_cma_alloc_start); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_cma_alloc_finish); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_rmqueue); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_pagecache_get_page); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_filemap_fault_get_page); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_filemap_fault_cache_page); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_enable_thermal_genl_check); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_thermal_pm_notify_suspend); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_ufs_fill_prdt); diff --git a/include/linux/mm.h b/include/linux/mm.h index 6f5261b3bd47..f9f8d7f1058e 100644 --- a/include/linux/mm.h +++ b/include/linux/mm.h @@ -573,6 +573,7 @@ struct vm_fault { */ unsigned long vma_flags; pgprot_t vma_page_prot; + ANDROID_OEM_DATA_ARRAY(1, 2); }; /* page entry size for vm->huge_fault() */ diff --git a/include/trace/hooks/mm.h b/include/trace/hooks/mm.h index 99655b3657ee..2f00e27393c1 100644 --- a/include/trace/hooks/mm.h +++ b/include/trace/hooks/mm.h @@ -42,6 +42,12 @@ DECLARE_HOOK(android_vh_pagecache_get_page, TP_PROTO(struct address_space *mapping, pgoff_t index, int fgp_flags, gfp_t gfp_mask, struct page *page), TP_ARGS(mapping, index, fgp_flags, gfp_mask, page)); +DECLARE_HOOK(android_vh_filemap_fault_get_page, + TP_PROTO(struct vm_fault *vmf, struct page **page, bool *retry), + TP_ARGS(vmf, page, retry)); +DECLARE_HOOK(android_vh_filemap_fault_cache_page, + TP_PROTO(struct vm_fault *vmf, struct page *page), + TP_ARGS(vmf, page)); DECLARE_HOOK(android_vh_meminfo_proc_show, TP_PROTO(struct seq_file *m), TP_ARGS(m)); diff --git a/mm/filemap.c b/mm/filemap.c index ae831c96b5fc..d60dd67000fb 100644 --- a/mm/filemap.c +++ b/mm/filemap.c @@ -2728,13 +2728,20 @@ vm_fault_t filemap_fault(struct vm_fault *vmf) struct inode *inode = mapping->host; pgoff_t offset = vmf->pgoff; pgoff_t max_off; - struct page *page; + struct page *page = NULL; vm_fault_t ret = 0; + bool retry = false; max_off = DIV_ROUND_UP(i_size_read(inode), PAGE_SIZE); if (unlikely(offset >= max_off)) return VM_FAULT_SIGBUS; + trace_android_vh_filemap_fault_get_page(vmf, &page, &retry); + if (unlikely(retry)) + goto out_retry; + if (unlikely(page)) + goto page_ok; + /* * Do we have something in the page cache already? */ @@ -2790,6 +2797,7 @@ vm_fault_t filemap_fault(struct vm_fault *vmf) goto out_retry; } +page_ok: /* * Found the page and have a reference on it. * We must recheck i_size under page lock. @@ -2835,8 +2843,10 @@ vm_fault_t filemap_fault(struct vm_fault *vmf) * re-find the vma and come back and find our hopefully still populated * page. */ - if (page) + if (page) { + trace_android_vh_filemap_fault_cache_page(vmf, page); put_page(page); + } if (fpin) fput(fpin); return ret | VM_FAULT_RETRY;