From ec0684d2500c578edc79e58b26fba49b691f9a0c Mon Sep 17 00:00:00 2001 From: Zhou Jian Date: Thu, 22 Aug 2024 23:04:56 -0700 Subject: [PATCH] Reapply "ANDROID: Add a vendor hook that allow a module to modify the wake flag" This reverts commit e4bd522969262b7139f77bb27cd8b0094ddcaab9. Symbol is still needed in vendor. Bug: 361733032 Change-Id: I4542ad4263bf587115485e6579b7efb478485b68 Signed-off-by: Zhou Jian --- include/trace/hooks/sched.h | 8 ++++++++ kernel/sched/vendor_hooks.c | 2 ++ kernel/sched/wait.c | 6 +++++- net/core/sock.c | 13 ++++++++++++- 4 files changed, 27 insertions(+), 2 deletions(-) diff --git a/include/trace/hooks/sched.h b/include/trace/hooks/sched.h index a0a4b63843c8..30ee2ff1966b 100644 --- a/include/trace/hooks/sched.h +++ b/include/trace/hooks/sched.h @@ -241,6 +241,14 @@ DECLARE_RESTRICTED_HOOK(android_rvh_update_thermal_stats, TP_PROTO(int cpu), TP_ARGS(cpu), 1); +DECLARE_HOOK(android_vh_do_wake_up_sync, + TP_PROTO(struct wait_queue_head *wq_head, int *done, struct sock *sk), + TP_ARGS(wq_head, done, sk)); + +DECLARE_HOOK(android_vh_set_wake_flags, + TP_PROTO(int *wake_flags, unsigned int *mode), + TP_ARGS(wake_flags, mode)); + /* macro versions of hooks are no longer required */ #endif /* _TRACE_HOOK_SCHED_H */ diff --git a/kernel/sched/vendor_hooks.c b/kernel/sched/vendor_hooks.c index 51cfa7cbf9fa..6142660ea51a 100644 --- a/kernel/sched/vendor_hooks.c +++ b/kernel/sched/vendor_hooks.c @@ -64,3 +64,5 @@ EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_schedule_bug); EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_sched_exec); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_update_topology_flags_workfn); EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_update_thermal_stats); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_do_wake_up_sync); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_set_wake_flags); diff --git a/kernel/sched/wait.c b/kernel/sched/wait.c index 51e38f5f4701..3e28b779602d 100644 --- a/kernel/sched/wait.c +++ b/kernel/sched/wait.c @@ -4,6 +4,7 @@ * * (C) 2004 Nadia Yvette Chambers, Oracle */ +#include void __init_waitqueue_head(struct wait_queue_head *wq_head, const char *name, struct lock_class_key *key) { @@ -167,10 +168,13 @@ EXPORT_SYMBOL_GPL(__wake_up_locked_key); void __wake_up_sync_key(struct wait_queue_head *wq_head, unsigned int mode, void *key) { + int wake_flags = WF_SYNC; + if (unlikely(!wq_head)) return; - __wake_up_common_lock(wq_head, mode, 1, WF_SYNC, key); + trace_android_vh_set_wake_flags(&wake_flags, &mode); + __wake_up_common_lock(wq_head, mode, 1, wake_flags, key); } EXPORT_SYMBOL_GPL(__wake_up_sync_key); diff --git a/net/core/sock.c b/net/core/sock.c index 9abc4fe25953..381832d4bd05 100644 --- a/net/core/sock.c +++ b/net/core/sock.c @@ -140,6 +140,7 @@ #include #include +#include #include #include @@ -3370,9 +3371,19 @@ void sock_def_readable(struct sock *sk) rcu_read_lock(); wq = rcu_dereference(sk->sk_wq); - if (skwq_has_sleeper(wq)) + + if (skwq_has_sleeper(wq)) { + int done = 0; + + trace_android_vh_do_wake_up_sync(&wq->wait, &done, sk); + if (done) + goto out; + wake_up_interruptible_sync_poll(&wq->wait, EPOLLIN | EPOLLPRI | EPOLLRDNORM | EPOLLRDBAND); + } + +out: sk_wake_async_rcu(sk, SOCK_WAKE_WAITD, POLL_IN); rcu_read_unlock(); }