diff --git a/kernel/sched/walt/walt_lb.c b/kernel/sched/walt/walt_lb.c index 8b031c87a4f8..2436681312be 100644 --- a/kernel/sched/walt/walt_lb.c +++ b/kernel/sched/walt/walt_lb.c @@ -806,9 +806,9 @@ static bool should_help_min_cap(int this_cpu) /* similar to sysctl_sched_migration_cost */ #define NEWIDLE_BALANCE_THRESHOLD 500000 -static void walt_newidle_balance(void *unused, struct rq *this_rq, +static void walt_newidle_balance(struct rq *this_rq, struct rq_flags *rf, int *pulled_task, - int *done) + int *done, int force_overload) { int this_cpu = this_rq->cpu; struct walt_rq *wrq = &per_cpu(walt_rq, this_cpu); @@ -859,7 +859,7 @@ static void walt_newidle_balance(void *unused, struct rq *this_rq, if (walt_balance_rt(this_rq) || this_rq->nr_running) goto rt_pulled; - if (!READ_ONCE(this_rq->rd->overload)) + if (!force_overload && !READ_ONCE(this_rq->rd->overload)) goto repin; if (atomic_read(&this_rq->nr_iowait) && !enough_idle) @@ -958,7 +958,7 @@ void walt_smp_newidle_balance(void *ignored) rq_lock(rq, &rf); update_rq_clock(rq); - walt_newidle_balance(NULL, rq, &rf, &pulled_task, &done); + walt_newidle_balance(rq, &rf, &pulled_task, &done, true); resched_curr(rq); rq_unlock(rq, &rf); } @@ -1060,6 +1060,13 @@ static void walt_can_migrate_task(void *unused, struct task_struct *p, *can_migrate = 0; } +static void walt_sched_newidle_balance(void *unused, struct rq *this_rq, + struct rq_flags *rf, int *pulled_task, + int *done) +{ + walt_newidle_balance(this_rq, rf, pulled_task, done, false); +} + void walt_lb_init(void) { int cpu; @@ -1069,7 +1076,7 @@ void walt_lb_init(void) register_trace_android_rvh_sched_nohz_balancer_kick(walt_nohz_balancer_kick, NULL); register_trace_android_rvh_can_migrate_task(walt_can_migrate_task, NULL); register_trace_android_rvh_find_busiest_queue(walt_find_busiest_queue, NULL); - register_trace_android_rvh_sched_newidle_balance(walt_newidle_balance, NULL); + register_trace_android_rvh_sched_newidle_balance(walt_sched_newidle_balance, NULL); for_each_cpu(cpu, cpu_possible_mask) { call_single_data_t *csd;