From 0fabf2342f19cdce908440561d9e9390dd4b47f7 Mon Sep 17 00:00:00 2001 From: Tengfei Fan Date: Mon, 22 Nov 2021 09:15:36 +0800 Subject: [PATCH] ANDROID: sched: add hook point in do_sched_yield() When a task yields, it relinquishes the cpu and scheduler is tasked to find another task. However our vendor scheduler logic implementation could return the same task leading to a loop where the yielded task gets to run back, so add hook point in do_sched_yield() for vendor can do some work before task is scheduled. Bug: 205804537 Change-Id: I6528c3f4b0ee360559ef9c97cb1eb2b2d1357870 Signed-off-by: Tengfei Fan Signed-off-by: Sai Harshini Nimmala Signed-off-by: Khalid Shaik --- drivers/android/vendor_hooks.c | 1 + include/trace/hooks/sched.h | 4 ++++ kernel/sched/core.c | 2 ++ 3 files changed, 7 insertions(+) diff --git a/drivers/android/vendor_hooks.c b/drivers/android/vendor_hooks.c index bbcd6637148b..160920036a2f 100644 --- a/drivers/android/vendor_hooks.c +++ b/drivers/android/vendor_hooks.c @@ -255,6 +255,7 @@ EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_create_worker); EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_check_preempt_tick); EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_check_preempt_wakeup_ignore); EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_replace_next_task_fair); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_do_sched_yield); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_binder_wait_for_work); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_sync_txn_recvd); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_build_sched_domains); diff --git a/include/trace/hooks/sched.h b/include/trace/hooks/sched.h index 4233384f6ff8..f6e995d3faf0 100644 --- a/include/trace/hooks/sched.h +++ b/include/trace/hooks/sched.h @@ -291,6 +291,10 @@ DECLARE_RESTRICTED_HOOK(android_rvh_cpumask_any_and_distribute, const struct cpumask *new_mask, int *dest_cpu), TP_ARGS(p, cpu_valid_mask, new_mask, dest_cpu), 1); +DECLARE_RESTRICTED_HOOK(android_rvh_do_sched_yield, + TP_PROTO(struct rq *rq), + TP_ARGS(rq), 1); + DECLARE_HOOK(android_vh_free_task, TP_PROTO(struct task_struct *p), TP_ARGS(p)); diff --git a/kernel/sched/core.c b/kernel/sched/core.c index 583094de1de0..f3d29f744ab0 100644 --- a/kernel/sched/core.c +++ b/kernel/sched/core.c @@ -6353,6 +6353,8 @@ static void do_sched_yield(void) schedstat_inc(rq->yld_count); current->sched_class->yield_task(rq); + trace_android_rvh_do_sched_yield(rq); + preempt_disable(); rq_unlock_irq(rq, &rf); sched_preempt_enable_no_resched();