From da33f6fa6c8eb835984546d4a3b2b63502f3ee03 Mon Sep 17 00:00:00 2001 From: Liangliang Li Date: Tue, 8 Jun 2021 10:00:02 +0800 Subject: [PATCH] ANDROID: mm: Add hooks to filemap_fault for oem's optimization Add vendor_hooks to filemap_fault to cache page for oem's optimization. Save the page for next time retry when VM_FAULT_RETRY returned. Add ANDROID_OEM_DATA to vm_fault to save the page. Bug: 188891314 Change-Id: Ibfc9ec950c3360e6f6ccb9546cab0acd89e5d316 Signed-off-by: Liangliang Li --- drivers/android/vendor_hooks.c | 2 ++ include/linux/mm.h | 1 + include/trace/hooks/mm.h | 6 ++++++ mm/filemap.c | 14 ++++++++++++-- 4 files changed, 21 insertions(+), 2 deletions(-) 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;