diff options
Diffstat (limited to 'kernel/sched/fair.c')
| -rw-r--r-- | kernel/sched/fair.c | 43 |
1 files changed, 38 insertions, 5 deletions
diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c index 06639a3def40..85831d2f47ed 100644 --- a/kernel/sched/fair.c +++ b/kernel/sched/fair.c @@ -2777,6 +2777,14 @@ static int __read_mostly sched_upmigrate_min_nice = 15; int __read_mostly sysctl_sched_upmigrate_min_nice = 15; /* + * The load scale factor of a CPU gets boosted when its max frequency + * is restricted due to which the tasks are migrating to higher capacity + * CPUs early. The sched_upmigrate threshold is auto-upgraded by + * rq->max_possible_freq/rq->max_freq of a lower capacity CPU. + */ +unsigned int up_down_migrate_scale_factor = 1024; + +/* * Scheduler boost is a mechanism to temporarily place tasks on CPUs * with higher capacity than those where a task would have normally * ended up with their load characteristics. Any entity enabling @@ -2791,6 +2799,35 @@ static inline int available_cpu_capacity(int cpu) return rq->capacity; } +void update_up_down_migrate(void) +{ + unsigned int up_migrate = pct_to_real(sysctl_sched_upmigrate_pct); + unsigned int down_migrate = pct_to_real(sysctl_sched_downmigrate_pct); + unsigned int delta; + + if (up_down_migrate_scale_factor == 1024) + goto done; + + delta = up_migrate - down_migrate; + + up_migrate /= NSEC_PER_USEC; + up_migrate *= up_down_migrate_scale_factor; + up_migrate >>= 10; + up_migrate *= NSEC_PER_USEC; + + up_migrate = min(up_migrate, sched_ravg_window); + + down_migrate /= NSEC_PER_USEC; + down_migrate *= up_down_migrate_scale_factor; + down_migrate >>= 10; + down_migrate *= NSEC_PER_USEC; + + down_migrate = min(down_migrate, up_migrate - delta); +done: + sched_upmigrate = up_migrate; + sched_downmigrate = down_migrate; +} + void set_hmp_defaults(void) { sched_spill_load = @@ -2799,11 +2836,7 @@ void set_hmp_defaults(void) sched_small_task = pct_to_real(sysctl_sched_small_task_pct); - sched_upmigrate = - pct_to_real(sysctl_sched_upmigrate_pct); - - sched_downmigrate = - pct_to_real(sysctl_sched_downmigrate_pct); + update_up_down_migrate(); #ifdef CONFIG_SCHED_FREQ_INPUT sched_heavy_task = |
