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_cma_alloc_finish);
|
||||||
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_rmqueue);
|
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_rmqueue);
|
||||||
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_pagecache_get_page);
|
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_enable_thermal_genl_check);
|
||||||
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_thermal_pm_notify_suspend);
|
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_thermal_pm_notify_suspend);
|
||||||
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_ufs_fill_prdt);
|
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_ufs_fill_prdt);
|
||||||
|
@@ -573,6 +573,7 @@ struct vm_fault {
|
|||||||
*/
|
*/
|
||||||
unsigned long vma_flags;
|
unsigned long vma_flags;
|
||||||
pgprot_t vma_page_prot;
|
pgprot_t vma_page_prot;
|
||||||
|
ANDROID_OEM_DATA_ARRAY(1, 2);
|
||||||
};
|
};
|
||||||
|
|
||||||
/* page entry size for vm->huge_fault() */
|
/* 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,
|
TP_PROTO(struct address_space *mapping, pgoff_t index,
|
||||||
int fgp_flags, gfp_t gfp_mask, struct page *page),
|
int fgp_flags, gfp_t gfp_mask, struct page *page),
|
||||||
TP_ARGS(mapping, index, fgp_flags, gfp_mask, 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,
|
DECLARE_HOOK(android_vh_meminfo_proc_show,
|
||||||
TP_PROTO(struct seq_file *m),
|
TP_PROTO(struct seq_file *m),
|
||||||
TP_ARGS(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;
|
struct inode *inode = mapping->host;
|
||||||
pgoff_t offset = vmf->pgoff;
|
pgoff_t offset = vmf->pgoff;
|
||||||
pgoff_t max_off;
|
pgoff_t max_off;
|
||||||
struct page *page;
|
struct page *page = NULL;
|
||||||
vm_fault_t ret = 0;
|
vm_fault_t ret = 0;
|
||||||
|
bool retry = false;
|
||||||
|
|
||||||
max_off = DIV_ROUND_UP(i_size_read(inode), PAGE_SIZE);
|
max_off = DIV_ROUND_UP(i_size_read(inode), PAGE_SIZE);
|
||||||
if (unlikely(offset >= max_off))
|
if (unlikely(offset >= max_off))
|
||||||
return VM_FAULT_SIGBUS;
|
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?
|
* Do we have something in the page cache already?
|
||||||
*/
|
*/
|
||||||
@@ -2790,6 +2797,7 @@ retry_find:
|
|||||||
goto out_retry;
|
goto out_retry;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
page_ok:
|
||||||
/*
|
/*
|
||||||
* Found the page and have a reference on it.
|
* Found the page and have a reference on it.
|
||||||
* We must recheck i_size under page lock.
|
* 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
|
* re-find the vma and come back and find our hopefully still populated
|
||||||
* page.
|
* page.
|
||||||
*/
|
*/
|
||||||
if (page)
|
if (page) {
|
||||||
|
trace_android_vh_filemap_fault_cache_page(vmf, page);
|
||||||
put_page(page);
|
put_page(page);
|
||||||
|
}
|
||||||
if (fpin)
|
if (fpin)
|
||||||
fput(fpin);
|
fput(fpin);
|
||||||
return ret | VM_FAULT_RETRY;
|
return ret | VM_FAULT_RETRY;
|
||||||
|
Reference in New Issue
Block a user