--- a/kernel/sched_fair.c 2019-02-22 21:32:02.354631002 +0900 +++ b/kernel/sched_fair.c 2019-02-22 21:33:11.154631002 +0900 @@ -2275,7 +2275,13 @@ u64 total, available; total = sched_avg_period() + (rq->clock - rq->age_stamp); - available = total - rq->rt_avg; + + if (unlikely(total < rq->rt_avg)) { + /* Ensures that power won't end up being negative */ + available = 0; + } else { + available = total - rq->rt_avg; + } if (unlikely((s64)total < SCHED_LOAD_SCALE)) total = SCHED_LOAD_SCALE; @@ -2826,7 +2832,9 @@ if (sds.this_load >= sds.max_load) goto out_balanced; - sds.avg_load = (SCHED_LOAD_SCALE * sds.total_load) / sds.total_pwr; + sds.avg_load = (SCHED_LOAD_SCALE * sds.total_load) / + (sds.total_pwr?sds.total_pwr:1); + if (sds.this_load >= sds.avg_load) goto out_balanced;