From 6dd6d921ca4e40213de9bbc912d6681f9548ad6b Mon Sep 17 00:00:00 2001 From: Xiaojun Ji Date: Thu, 13 Jul 2023 18:22:54 +0800 Subject: [PATCH] moto_mmap_fault: Support the new hook The latest GKI has added a vendor hook to tune ra size in do_sync_mmap_readahead(). Add a new handler to limit the mmap readahead size. Change-Id: I609fd3e4583b37561faea5e108ca9e664f956098 Reviewed-on: https://gerrit.mot.com/2676241 SME-Granted: SME Approvals Granted SLTApproved: Slta Waiver Tested-by: Jira Key Reviewed-by: Zonghua Liu Reviewed-by: Huosheng Liao Reviewed-by: Chuanchun Zhu Submit-Approved: Jira Key Reviewed-on: https://gerrit.mot.com/2676239 --- drivers/moto_mmap_fault/Android.mk | 6 +++++ drivers/moto_mmap_fault/moto_mmap_fault.c | 28 ++++++++++++++++++++++- 2 files changed, 33 insertions(+), 1 deletion(-) diff --git a/drivers/moto_mmap_fault/Android.mk b/drivers/moto_mmap_fault/Android.mk index c29e1c9b7afb..9047a745bf23 100644 --- a/drivers/moto_mmap_fault/Android.mk +++ b/drivers/moto_mmap_fault/Android.mk @@ -5,4 +5,10 @@ include $(CLEAR_VARS) LOCAL_MODULE := moto_mmap_fault.ko LOCAL_MODULE_TAGS := optional LOCAL_MODULE_PATH := $(KERNEL_MODULES_OUT) + +ifeq ($(TUNE_MMAP_READAROUND), true) + KERNEL_CFLAGS += KCFLAGS=-DTUNE_MMAP_READAROUND + KBUILD_OPTIONS += KCFLAGS=-DTUNE_MMAP_READAROUND +endif + include $(DLKM_DIR)/AndroidKernelModule.mk diff --git a/drivers/moto_mmap_fault/moto_mmap_fault.c b/drivers/moto_mmap_fault/moto_mmap_fault.c index fc649a44245c..5578d7c18283 100644 --- a/drivers/moto_mmap_fault/moto_mmap_fault.c +++ b/drivers/moto_mmap_fault/moto_mmap_fault.c @@ -14,10 +14,28 @@ #include #include #include +#include static int max_ra_pages = 8; module_param(max_ra_pages, int, S_IRUGO | S_IWUSR); MODULE_PARM_DESC(max_ra_pages, "Max read ahead pages"); + +#if LINUX_VERSION_CODE > KERNEL_VERSION(5, 15, 104) || (LINUX_VERSION_CODE > KERNEL_VERSION(5, 10, 177) && LINUX_VERSION_CODE < KERNEL_VERSION(5, 15, 0)) +#ifndef TUNE_MMAP_READAROUND +#define TUNE_MMAP_READAROUND +#endif +#endif + +#if defined(TUNE_MMAP_READAROUND) +static void __nocfi tune_mmap_readaround(void *p, unsigned int ra_pages, pgoff_t pgoff, + pgoff_t *start, unsigned int *size, unsigned int *async_size) +{ + *start = max_t(long, 0, pgoff - max_ra_pages / 2); + *size = max_ra_pages; + *async_size = max_ra_pages / 4; + return; +} +#else static void __nocfi filemap_fault_get_page(void *p, struct vm_fault *vmf, struct page **page_out, bool *retry) { struct file *file = vmf->vma->vm_file; @@ -82,13 +100,17 @@ static void __nocfi filemap_fault_cache_page(void *p, struct vm_fault *vmf, stru vmf->android_oem_data1[1] = 0; } } +#endif static int __nocfi __init moto_mmap_fault_init(void) { int ret = 0; +#if defined(TUNE_MMAP_READAROUND) + ret = register_trace_android_vh_tune_mmap_readaround(tune_mmap_readaround, NULL); +#else ret = register_trace_android_vh_filemap_fault_get_page(filemap_fault_get_page, NULL) ?: register_trace_android_vh_filemap_fault_cache_page(filemap_fault_cache_page, NULL); - +#endif if (ret != 0) return -ENXIO; else @@ -96,8 +118,12 @@ static int __nocfi __init moto_mmap_fault_init(void) } static void __nocfi __exit moto_mmap_fault_exit(void) { +#if defined(TUNE_MMAP_READAROUND) + unregister_trace_android_vh_tune_mmap_readaround(tune_mmap_readaround, NULL); +#else unregister_trace_android_vh_filemap_fault_get_page(filemap_fault_get_page, NULL); unregister_trace_android_vh_filemap_fault_cache_page(filemap_fault_cache_page, NULL); +#endif } module_init(moto_mmap_fault_init);