diff --git a/kernel/sched/walt/walt.c b/kernel/sched/walt/walt.c index 7f36dff545c2..c0a58e84e3f5 100644 --- a/kernel/sched/walt/walt.c +++ b/kernel/sched/walt/walt.c @@ -3834,6 +3834,7 @@ static void walt_sched_init_rq(struct rq *rq) } wrq->notif_pending = false; + wrq->num_mvp_tasks = 0; INIT_LIST_HEAD(&wrq->mvp_tasks); } @@ -4329,7 +4330,7 @@ static void walt_do_sched_yield(void *unused, struct rq *rq) lockdep_assert_held(&rq->__lock); if (!list_empty(&wts->mvp_list) && wts->mvp_list.next) - walt_cfs_deactivate_mvp_task(curr); + walt_cfs_deactivate_mvp_task(rq, curr); if (per_cpu(rt_task_arrival_time, cpu_of(rq))) per_cpu(rt_task_arrival_time, cpu_of(rq)) = 0; diff --git a/kernel/sched/walt/walt.h b/kernel/sched/walt/walt.h index 717ae9f5f52f..47a4168cb00e 100644 --- a/kernel/sched/walt/walt.h +++ b/kernel/sched/walt/walt.h @@ -121,6 +121,7 @@ struct walt_rq { u64 last_cc_update; u64 cycles; struct list_head mvp_tasks; + int num_mvp_tasks; u64 latest_clock; }; @@ -942,7 +943,7 @@ extern struct rq *__migrate_task(struct rq *rq, struct rq_flags *rf, DECLARE_PER_CPU(u64, rt_task_arrival_time); extern int walt_get_mvp_task_prio(struct task_struct *p); -extern void walt_cfs_deactivate_mvp_task(struct task_struct *p); +extern void walt_cfs_deactivate_mvp_task(struct rq *rq, struct task_struct *p); enum WALT_DEBUG_FEAT { WALT_BUG_UPSTREAM, diff --git a/kernel/sched/walt/walt_cfs.c b/kernel/sched/walt/walt_cfs.c index 5521856ac5d8..8f0ccda118b1 100644 --- a/kernel/sched/walt/walt_cfs.c +++ b/kernel/sched/walt/walt_cfs.c @@ -1064,14 +1064,17 @@ static void walt_cfs_insert_mvp_task(struct walt_rq *wrq, struct walt_task_struc } list_add(&wts->mvp_list, pos->prev); + wrq->num_mvp_tasks++; } -void walt_cfs_deactivate_mvp_task(struct task_struct *p) +void walt_cfs_deactivate_mvp_task(struct rq *rq, struct task_struct *p) { + struct walt_rq *wrq = (struct walt_rq *) rq->android_vendor_data1; struct walt_task_struct *wts = (struct walt_task_struct *) p->android_vendor_data1; list_del_init(&wts->mvp_list); wts->mvp_prio = WALT_NOT_MVP; + wrq->num_mvp_tasks--; } /* @@ -1123,13 +1126,14 @@ static void walt_cfs_account_mvp_runtime(struct rq *rq, struct task_struct *curr limit = walt_cfs_mvp_task_limit(curr); if (wts->total_exec > limit) { - walt_cfs_deactivate_mvp_task(curr); + walt_cfs_deactivate_mvp_task(rq, curr); trace_walt_cfs_deactivate_mvp_task(curr, wts, limit); return; } /* slice expired. re-queue the task */ list_del(&wts->mvp_list); + wrq->num_mvp_tasks--; walt_cfs_insert_mvp_task(wrq, wts, false); } @@ -1169,7 +1173,7 @@ void walt_cfs_dequeue_task(struct rq *rq, struct task_struct *p) struct walt_task_struct *wts = (struct walt_task_struct *) p->android_vendor_data1; if (!list_empty(&wts->mvp_list) && wts->mvp_list.next) - walt_cfs_deactivate_mvp_task(p); + walt_cfs_deactivate_mvp_task(rq, p); /* * Reset the exec time during sleep so that it starts