diff --git a/drivers/android/vendor_hooks.c b/drivers/android/vendor_hooks.c index f24ceeae8bc4..04a04da448f8 100644 --- a/drivers/android/vendor_hooks.c +++ b/drivers/android/vendor_hooks.c @@ -159,3 +159,4 @@ 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_vh_build_sched_domains); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_update_topology_flags_workfn); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_sched_balance_rt); diff --git a/include/trace/hooks/sched.h b/include/trace/hooks/sched.h index b2bd258a3e27..76289757e163 100644 --- a/include/trace/hooks/sched.h +++ b/include/trace/hooks/sched.h @@ -244,6 +244,9 @@ DECLARE_RESTRICTED_HOOK(android_rvh_replace_next_task_fair, TP_PROTO(struct rq *rq, struct task_struct **p, struct sched_entity **se, bool *repick, bool simple), TP_ARGS(rq, p, se, repick, simple), 1); +DECLARE_RESTRICTED_HOOK(android_rvh_sched_balance_rt, + TP_PROTO(struct rq *rq, struct task_struct *p, int *done), + TP_ARGS(rq, p, done), 1); #endif /* _TRACE_HOOK_SCHED_H */ /* This part must be outside protection */ diff --git a/kernel/sched/rt.c b/kernel/sched/rt.c index 60b56b319051..da9b6bfbb75a 100644 --- a/kernel/sched/rt.c +++ b/kernel/sched/rt.c @@ -1571,6 +1571,8 @@ static void check_preempt_equal_prio(struct rq *rq, struct task_struct *p) static int balance_rt(struct rq *rq, struct task_struct *p, struct rq_flags *rf) { if (!on_rt_rq(&p->rt) && need_pull_rt_task(rq, p)) { + int done = 0; + /* * This is OK, because current is on_cpu, which avoids it being * picked for load-balance and preemption/IRQs are still @@ -1578,7 +1580,9 @@ static int balance_rt(struct rq *rq, struct task_struct *p, struct rq_flags *rf) * not yet started the picking loop. */ rq_unpin_lock(rq, rf); - pull_rt_task(rq); + trace_android_rvh_sched_balance_rt(rq, p, &done); + if (!done) + pull_rt_task(rq); rq_repin_lock(rq, rf); } @@ -1720,7 +1724,7 @@ static int pick_rt_task(struct rq *rq, struct task_struct *p, int cpu) * Return the highest pushable rq's task, which is suitable to be executed * on the CPU, NULL otherwise */ -static struct task_struct *pick_highest_pushable_task(struct rq *rq, int cpu) +struct task_struct *pick_highest_pushable_task(struct rq *rq, int cpu) { struct plist_head *head = &rq->rt.pushable_tasks; struct task_struct *p; @@ -1735,6 +1739,7 @@ static struct task_struct *pick_highest_pushable_task(struct rq *rq, int cpu) return NULL; } +EXPORT_SYMBOL_GPL(pick_highest_pushable_task); static DEFINE_PER_CPU(cpumask_var_t, local_cpu_mask); diff --git a/kernel/sched/sched.h b/kernel/sched/sched.h index 1eb81a4cbcb6..f6b2a5e1f143 100644 --- a/kernel/sched/sched.h +++ b/kernel/sched/sched.h @@ -873,6 +873,7 @@ extern void sched_put_rd(struct root_domain *rd); #ifdef HAVE_RT_PUSH_IPI extern void rto_push_irq_work_func(struct irq_work *work); #endif +extern struct task_struct *pick_highest_pushable_task(struct rq *rq, int cpu); #endif /* CONFIG_SMP */ #ifdef CONFIG_UCLAMP_TASK