diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c index 9fbcb25e8b72..b5dc0bee902d 100644 --- a/kernel/sched/fair.c +++ b/kernel/sched/fair.c @@ -10261,6 +10261,9 @@ static inline unsigned long get_sd_balance_interval(struct sched_domain *sd, int cpu_busy) { unsigned long interval = sd->balance_interval; +#ifdef CONFIG_SCHED_WALT + unsigned int cpu; +#endif if (cpu_busy) interval *= sd->busy_factor; @@ -10269,6 +10272,26 @@ get_sd_balance_interval(struct sched_domain *sd, int cpu_busy) interval = msecs_to_jiffies(interval); interval = clamp(interval, 1UL, max_load_balance_interval); + /* + * check if sched domain is marked as overutilized + * we ought to only do this on systems which have SD_ASYMCAPACITY + * but we want to do it for all sched domains in those systems + * So for now, just check if overutilized as a proxy. + */ + /* + * If we are overutilized and we have a misfit task, then + * we want to balance as soon as practically possible, so + * we return an interval of zero, except for busy balance. + */ +#ifdef CONFIG_SCHED_WALT + if (sd_overutilized(sd) && !cpu_busy) { + /* we know the root is overutilized, let's check for a misfit task */ + for_each_cpu(cpu, sched_domain_span(sd)) { + if (cpu_rq(cpu)->misfit_task_load) + return 1; + } + } +#endif return interval; }