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:

committed by
Sandeep Patil

parent
97e5f9c0f8
commit
da33f6fa6c
@@ -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);
|
||||
|
@@ -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() */
|
||||
|
@@ -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));
|
||||
|
14
mm/filemap.c
14
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 @@ 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;
|
||||
|
Reference in New Issue
Block a user