From d256bfafa978a159f6e541969f1a496e2342508b Mon Sep 17 00:00:00 2001 From: Zhifeng Zhu Date: Thu, 27 Jun 2024 16:38:45 +0800 Subject: [PATCH] ANDROID: vendor_hooks: add hooks in prctl_set_vma In some special scenarios, some threads are allowed to skip waiting, write the set_anon_name task into the queue and return directly, thus improving the system's response speed and performance. Bug: 349739224 Change-Id: Id3686309da108e242a30cfaf68f859b10215f402 Signed-off-by: Zhifeng Zhu --- drivers/android/vendor_hooks.c | 1 + include/trace/hooks/sys.h | 4 ++++ kernel/sys.c | 5 +++++ 3 files changed, 10 insertions(+) diff --git a/drivers/android/vendor_hooks.c b/drivers/android/vendor_hooks.c index 9d4ee2802caf..9abc0d1f53a3 100644 --- a/drivers/android/vendor_hooks.c +++ b/drivers/android/vendor_hooks.c @@ -433,3 +433,4 @@ EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_record_rwsem_reader_owned); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_clear_rwsem_reader_owned); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_record_rwsem_writer_owned); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_clear_rwsem_writer_owned); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_pr_set_vma_name_bypass); diff --git a/include/trace/hooks/sys.h b/include/trace/hooks/sys.h index e2d5d6d4fc14..120bfedea008 100644 --- a/include/trace/hooks/sys.h +++ b/include/trace/hooks/sys.h @@ -11,6 +11,10 @@ struct task_struct; DECLARE_HOOK(android_vh_syscall_prctl_finished, TP_PROTO(int option, struct task_struct *task), TP_ARGS(option, task)); +DECLARE_RESTRICTED_HOOK(android_rvh_pr_set_vma_name_bypass, + TP_PROTO(struct mm_struct *mm, unsigned long addr, unsigned long size, + struct anon_vma_name *anon_name, int *error, bool *bypass), + TP_ARGS(mm, addr, size, anon_name, error, bypass), 1); #endif #include diff --git a/kernel/sys.c b/kernel/sys.c index 7a5dca7dfac3..380cee197118 100644 --- a/kernel/sys.c +++ b/kernel/sys.c @@ -2330,6 +2330,7 @@ static int prctl_set_vma(unsigned long opt, unsigned long addr, struct mm_struct *mm = current->mm; const char __user *uname; struct anon_vma_name *anon_name = NULL; + bool bypass = false; int error; switch (opt) { @@ -2356,6 +2357,10 @@ static int prctl_set_vma(unsigned long opt, unsigned long addr, } + trace_android_rvh_pr_set_vma_name_bypass(mm, addr, size, anon_name, + &error, &bypass); + if (bypass) + return error; mmap_write_lock(mm); error = madvise_set_anon_name(mm, addr, size, anon_name); mmap_write_unlock(mm);