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 <liliangliang@vivo.com>
This commit is contained in:
Liangliang Li
2021-06-08 10:00:02 +08:00
committed by Sandeep Patil
parent 97e5f9c0f8
commit da33f6fa6c
4 changed files with 21 additions and 2 deletions

View File

@@ -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);

View File

@@ -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() */

View File

@@ -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));

View File

@@ -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 @@ retry_find:
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 @@ out_retry:
* 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;