|
@@ -4862,33 +4862,39 @@ next:
|
|
|
done:
|
|
|
return target;
|
|
|
}
|
|
|
+
|
|
|
/*
|
|
|
* cpu_util returns the amount of capacity of a CPU that is used by CFS
|
|
|
* tasks. The unit of the return value must be the one of capacity so we can
|
|
|
* compare the utilization with the capacity of the CPU that is available for
|
|
|
* CFS task (ie cpu_capacity).
|
|
|
- * cfs.avg.util_avg is the sum of running time of runnable tasks on a
|
|
|
- * CPU. It represents the amount of utilization of a CPU in the range
|
|
|
- * [0..SCHED_LOAD_SCALE]. The utilization of a CPU can't be higher than the
|
|
|
- * full capacity of the CPU because it's about the running time on this CPU.
|
|
|
- * Nevertheless, cfs.avg.util_avg can be higher than SCHED_LOAD_SCALE
|
|
|
- * because of unfortunate rounding in util_avg or just
|
|
|
- * after migrating tasks until the average stabilizes with the new running
|
|
|
- * time. So we need to check that the utilization stays into the range
|
|
|
- * [0..cpu_capacity_orig] and cap if necessary.
|
|
|
- * Without capping the utilization, a group could be seen as overloaded (CPU0
|
|
|
- * utilization at 121% + CPU1 utilization at 80%) whereas CPU1 has 20% of
|
|
|
- * available capacity.
|
|
|
+ *
|
|
|
+ * cfs_rq.avg.util_avg is the sum of running time of runnable tasks plus the
|
|
|
+ * recent utilization of currently non-runnable tasks on a CPU. It represents
|
|
|
+ * the amount of utilization of a CPU in the range [0..capacity_orig] where
|
|
|
+ * capacity_orig is the cpu_capacity available at the highest frequency
|
|
|
+ * (arch_scale_freq_capacity()).
|
|
|
+ * The utilization of a CPU converges towards a sum equal to or less than the
|
|
|
+ * current capacity (capacity_curr <= capacity_orig) of the CPU because it is
|
|
|
+ * the running time on this CPU scaled by capacity_curr.
|
|
|
+ *
|
|
|
+ * Nevertheless, cfs_rq.avg.util_avg can be higher than capacity_curr or even
|
|
|
+ * higher than capacity_orig because of unfortunate rounding in
|
|
|
+ * cfs.avg.util_avg or just after migrating tasks and new task wakeups until
|
|
|
+ * the average stabilizes with the new running time. We need to check that the
|
|
|
+ * utilization stays within the range of [0..capacity_orig] and cap it if
|
|
|
+ * necessary. Without utilization capping, a group could be seen as overloaded
|
|
|
+ * (CPU0 utilization at 121% + CPU1 utilization at 80%) whereas CPU1 has 20% of
|
|
|
+ * available capacity. We allow utilization to overshoot capacity_curr (but not
|
|
|
+ * capacity_orig) as it useful for predicting the capacity required after task
|
|
|
+ * migrations (scheduler-driven DVFS).
|
|
|
*/
|
|
|
static int cpu_util(int cpu)
|
|
|
{
|
|
|
unsigned long util = cpu_rq(cpu)->cfs.avg.util_avg;
|
|
|
unsigned long capacity = capacity_orig_of(cpu);
|
|
|
|
|
|
- if (util >= SCHED_LOAD_SCALE)
|
|
|
- return capacity;
|
|
|
-
|
|
|
- return (util * capacity) >> SCHED_LOAD_SHIFT;
|
|
|
+ return (util >= capacity) ? capacity : util;
|
|
|
}
|
|
|
|
|
|
/*
|