From 16f2ad77c76c28271d8ea4c444f61174ea69162d Mon Sep 17 00:00:00 2001 From: xieliujie Date: Sat, 22 Apr 2023 21:34:56 +0800 Subject: [PATCH] ANDROID: vendor_hooks: Add hooks for oem futex optimization If an important task is going to sleep through do_futex(), find out it's futex-owner by the pid comes from userspace, and boost the owner by some means to shorten the sleep time. How to boost? Depends on these hooks: commit 53e809978443 ("ANDROID: vendor_hooks: Add hooks for scheduler") Bug: 243110112 Signed-off-by: xieliujie Change-Id: I9a315cfb414fd34e0ef7a2cf9d57df50d4dd984f (cherry picked from commit 548da5d23d98b796cf9a478675622a606b3307c8) --- drivers/android/vendor_hooks.c | 7 +++++++ include/trace/hooks/futex.h | 28 ++++++++++++++++++++++++---- kernel/futex/syscalls.c | 2 ++ kernel/futex/waitwake.c | 7 +++++++ 4 files changed, 40 insertions(+), 4 deletions(-) diff --git a/drivers/android/vendor_hooks.c b/drivers/android/vendor_hooks.c index 6bb8aab26636..14e6323e3f70 100644 --- a/drivers/android/vendor_hooks.c +++ b/drivers/android/vendor_hooks.c @@ -8,6 +8,7 @@ #include #include +#include #include #define CREATE_TRACE_POINTS @@ -174,6 +175,12 @@ EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_rwsem_wake); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_rwsem_write_finished); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_alter_rwsem_list_add); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_alter_futex_plist_add); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_do_futex); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_futex_wait_start); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_futex_wait_end); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_futex_wake_traverse_plist); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_futex_wake_this); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_futex_wake_up_q_finish); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_sha256); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_aes_expandkey); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_aes_encrypt); diff --git a/include/trace/hooks/futex.h b/include/trace/hooks/futex.h index cbf6abb66a57..ab429aca1212 100644 --- a/include/trace/hooks/futex.h +++ b/include/trace/hooks/futex.h @@ -12,15 +12,35 @@ * Following tracepoints are not exported in tracefs and provide a * mechanism for vendor modules to hook and extend functionality */ -#if defined(CONFIG_TRACEPOINTS) && defined(CONFIG_ANDROID_VENDOR_HOOKS) DECLARE_HOOK(android_vh_alter_futex_plist_add, TP_PROTO(struct plist_node *node, struct plist_head *head, bool *already_on_hb), TP_ARGS(node, head, already_on_hb)); -#else -#define trace_android_vh_alter_futex_plist_add(node, head, already_on_hb) -#endif +DECLARE_HOOK(android_vh_do_futex, + TP_PROTO(int cmd, + unsigned int *flags, + u32 __user *uaddr2), + TP_ARGS(cmd, flags, uaddr2)); +DECLARE_HOOK(android_vh_futex_wait_start, + TP_PROTO(unsigned int flags, + u32 bitset), + TP_ARGS(flags, bitset)); +DECLARE_HOOK(android_vh_futex_wait_end, + TP_PROTO(unsigned int flags, + u32 bitset), + TP_ARGS(flags, bitset)); +DECLARE_HOOK(android_vh_futex_wake_traverse_plist, + TP_PROTO(struct plist_head *chain, int *target_nr, + union futex_key key, u32 bitset), + TP_ARGS(chain, target_nr, key, bitset)); +DECLARE_HOOK(android_vh_futex_wake_this, + TP_PROTO(int ret, int nr_wake, int target_nr, + struct task_struct *p), + TP_ARGS(ret, nr_wake, target_nr, p)); +DECLARE_HOOK(android_vh_futex_wake_up_q_finish, + TP_PROTO(int nr_wake, int target_nr), + TP_ARGS(nr_wake, target_nr)); #endif /* _TRACE_HOOK_FUTEX_H */ /* This part must be outside protection */ #include diff --git a/kernel/futex/syscalls.c b/kernel/futex/syscalls.c index a8074079b09e..e4970139ed5b 100644 --- a/kernel/futex/syscalls.c +++ b/kernel/futex/syscalls.c @@ -5,6 +5,7 @@ #include #include "futex.h" +#include /* * Support for robust futexes: the kernel cleans up held futexes at @@ -98,6 +99,7 @@ long do_futex(u32 __user *uaddr, int op, u32 val, ktime_t *timeout, return -ENOSYS; } + trace_android_vh_do_futex(cmd, &flags, uaddr2); switch (cmd) { case FUTEX_WAIT: val3 = FUTEX_BITSET_MATCH_ANY; diff --git a/kernel/futex/waitwake.c b/kernel/futex/waitwake.c index ba01b9408203..a890954a6abd 100644 --- a/kernel/futex/waitwake.c +++ b/kernel/futex/waitwake.c @@ -5,6 +5,7 @@ #include #include "futex.h" +#include /* * READ this before attempting to hack on futexes! @@ -146,6 +147,7 @@ int futex_wake(u32 __user *uaddr, unsigned int flags, int nr_wake, u32 bitset) struct futex_q *this, *next; union futex_key key = FUTEX_KEY_INIT; int ret; + int target_nr; DEFINE_WAKE_Q(wake_q); if (!bitset) @@ -163,6 +165,7 @@ int futex_wake(u32 __user *uaddr, unsigned int flags, int nr_wake, u32 bitset) spin_lock(&hb->lock); + trace_android_vh_futex_wake_traverse_plist(&hb->chain, &target_nr, key, bitset); plist_for_each_entry_safe(this, next, &hb->chain, list) { if (futex_match (&this->key, &key)) { if (this->pi_state || this->rt_waiter) { @@ -174,6 +177,7 @@ int futex_wake(u32 __user *uaddr, unsigned int flags, int nr_wake, u32 bitset) if (!(this->bitset & bitset)) continue; + trace_android_vh_futex_wake_this(ret, nr_wake, target_nr, this->task); futex_wake_mark(&wake_q, this); if (++ret >= nr_wake) break; @@ -182,6 +186,7 @@ int futex_wake(u32 __user *uaddr, unsigned int flags, int nr_wake, u32 bitset) spin_unlock(&hb->lock); wake_up_q(&wake_q); + trace_android_vh_futex_wake_up_q_finish(nr_wake, target_nr); return ret; } @@ -640,6 +645,7 @@ int futex_wait(u32 __user *uaddr, unsigned int flags, u32 val, ktime_t *abs_time if (!bitset) return -EINVAL; q.bitset = bitset; + trace_android_vh_futex_wait_start(flags, bitset); to = futex_setup_timer(abs_time, &timeout, flags, current->timer_slack_ns); @@ -688,6 +694,7 @@ out: hrtimer_cancel(&to->timer); destroy_hrtimer_on_stack(&to->timer); } + trace_android_vh_futex_wait_end(flags, bitset); return ret; }