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 <zhifeng.zhu@vivo.com>
This commit is contained in:
Zhifeng Zhu
2024-06-27 16:38:45 +08:00
committed by Treehugger Robot
parent 0468527935
commit d256bfafa9
3 changed files with 10 additions and 0 deletions

View File

@@ -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_clear_rwsem_reader_owned);
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_record_rwsem_writer_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_vh_clear_rwsem_writer_owned);
EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_pr_set_vma_name_bypass);

View File

@@ -11,6 +11,10 @@ struct task_struct;
DECLARE_HOOK(android_vh_syscall_prctl_finished, DECLARE_HOOK(android_vh_syscall_prctl_finished,
TP_PROTO(int option, struct task_struct *task), TP_PROTO(int option, struct task_struct *task),
TP_ARGS(option, 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 #endif
#include <trace/define_trace.h> #include <trace/define_trace.h>

View File

@@ -2330,6 +2330,7 @@ static int prctl_set_vma(unsigned long opt, unsigned long addr,
struct mm_struct *mm = current->mm; struct mm_struct *mm = current->mm;
const char __user *uname; const char __user *uname;
struct anon_vma_name *anon_name = NULL; struct anon_vma_name *anon_name = NULL;
bool bypass = false;
int error; int error;
switch (opt) { 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); mmap_write_lock(mm);
error = madvise_set_anon_name(mm, addr, size, anon_name); error = madvise_set_anon_name(mm, addr, size, anon_name);
mmap_write_unlock(mm); mmap_write_unlock(mm);