From eed86c5eb234ca9f5c07fb34bb2598fc25b46f5c Mon Sep 17 00:00:00 2001 From: Pavankumar Kondeti Date: Wed, 17 Feb 2021 13:43:19 +0530 Subject: [PATCH] sched/walt: Add fair task check in tick path load balance The tick path load balance is meant for fair tasks. Add a check for the same before considering the task for migration. The fair_policy() check alone does not work as it returns true for idle task and also for RT boosted tasks. Add a wrapper based on priority check. Change-Id: I05cc996cb15051e4f6bb1a73005234e4d5188d19 Signed-off-by: Pavankumar Kondeti --- kernel/sched/walt/walt.c | 4 ++-- kernel/sched/walt/walt.h | 9 +++++++++ kernel/sched/walt/walt_lb.c | 9 ++++----- 3 files changed, 15 insertions(+), 7 deletions(-) diff --git a/kernel/sched/walt/walt.c b/kernel/sched/walt/walt.c index fc9d05e02fbe..cdab278259e1 100644 --- a/kernel/sched/walt/walt.c +++ b/kernel/sched/walt/walt.c @@ -3752,7 +3752,7 @@ static void android_rvh_enqueue_task(void *unused, struct rq *rq, struct task_st wts->last_enqueued_ts = wallclock; sched_update_nr_prod(rq->cpu, true); - if (fair_policy(p->policy)) { + if (walt_fair_task(p)) { wts->misfit = !task_fits_max(p, rq->cpu); inc_rq_walt_stats(rq, p); } @@ -3772,7 +3772,7 @@ static void android_rvh_dequeue_task(void *unused, struct rq *rq, struct task_st sched_update_nr_prod(rq->cpu, false); - if (fair_policy(p->policy)) + if (walt_fair_task(p)) dec_rq_walt_stats(rq, p); walt_dec_cumulative_runnable_avg(rq, p); diff --git a/kernel/sched/walt/walt.h b/kernel/sched/walt/walt.h index fc186cf98c6b..f16314775ce6 100644 --- a/kernel/sched/walt/walt.h +++ b/kernel/sched/walt/walt.h @@ -858,4 +858,13 @@ static inline struct task_group *css_tg(struct cgroup_subsys_state *css) return css ? container_of(css, struct task_group, css) : NULL; } +/* + * The policy of a RT boosted task (via PI mutex) still indicates it is + * a fair task, so use prio check as well. The prio check alone is not + * sufficient since idle task also has 120 priority. + */ +static inline bool walt_fair_task(struct task_struct *p) +{ + return p->prio >= MAX_RT_PRIO && !is_idle_task(p); +} #endif /* _WALT_H */ diff --git a/kernel/sched/walt/walt_lb.c b/kernel/sched/walt/walt_lb.c index fb290403daae..c5eb0e5a31e8 100644 --- a/kernel/sched/walt/walt_lb.c +++ b/kernel/sched/walt/walt_lb.c @@ -144,7 +144,7 @@ static void walt_lb_check_for_rotation(struct rq *src_rq) if (is_reserved(i)) continue; - if (!rq->misfit_task_load) + if (!rq->misfit_task_load || !walt_fair_task(rq->curr)) continue; wts = (struct walt_task_struct *) rq->curr->android_vendor_data1; @@ -167,7 +167,7 @@ static void walt_lb_check_for_rotation(struct rq *src_rq) if (is_reserved(i)) continue; - if (rq->curr->prio < MAX_RT_PRIO) + if (!walt_fair_task(rq->curr)) continue; if (rq->nr_running > 1) @@ -191,8 +191,7 @@ static void walt_lb_check_for_rotation(struct rq *src_rq) dst_rq = cpu_rq(dst_cpu); double_rq_lock(src_rq, dst_rq); - if (dst_rq->curr->prio >= MAX_RT_PRIO && dst_rq->curr != dst_rq->idle && - src_rq->curr->prio >= MAX_RT_PRIO && src_rq->curr != src_rq->idle) { + if (walt_fair_task(dst_rq->curr)) { get_task_struct(src_rq->curr); get_task_struct(dst_rq->curr); @@ -494,7 +493,7 @@ static void walt_lb_tick(void *unused, struct rq *rq) if (static_branch_unlikely(&walt_disabled)) return; - if (!rq->misfit_task_load) + if (!rq->misfit_task_load || !walt_fair_task(p)) return; if (p->state != TASK_RUNNING || p->nr_cpus_allowed == 1)