From 19a7e0717d4659d0e6e96b84c194a13a468619a8 Mon Sep 17 00:00:00 2001 From: Zhifeng Zhu Date: Thu, 4 Jul 2024 14:47:17 +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 | 2 +- include/trace/hooks/sys.h | 5 +++++ kernel/sys.c | 5 +++++ 3 files changed, 11 insertions(+), 1 deletion(-) diff --git a/drivers/android/vendor_hooks.c b/drivers/android/vendor_hooks.c index 59cbd6c1ab30..69035c52d8d6 100644 --- a/drivers/android/vendor_hooks.c +++ b/drivers/android/vendor_hooks.c @@ -560,4 +560,4 @@ EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_resume_end); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_early_resume_begin); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_use_amu_fie); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_set_tsk_need_resched_lazy); - +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 e14be462d21b..98a024e4adf9 100644 --- a/include/trace/hooks/sys.h +++ b/include/trace/hooks/sys.h @@ -14,6 +14,11 @@ DECLARE_HOOK(android_vh_syscall_prctl_finished, DECLARE_HOOK(android_vh_security_audit_log_setid, TP_PROTO(u32 type, u32 old_id, u32 new_id), TP_ARGS(type, old_id, new_id)); + +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 eb24ff0fb46e..4a87dc5fa867 100644 --- a/kernel/sys.c +++ b/kernel/sys.c @@ -2358,6 +2358,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) { @@ -2384,6 +2385,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);