OSDN Git Service

sched: Fix the bug in select_best_cpu() that returns -1 as target_cpu
authorPavankumar Kondeti <pkondeti@codeaurora.org>
Thu, 8 Jun 2017 09:49:48 +0000 (15:19 +0530)
committerPavankumar Kondeti <pkondeti@codeaurora.org>
Fri, 9 Jun 2017 01:10:02 +0000 (06:40 +0530)
select_best_cpu() has previous CPU's cluster bias which overrides
the best_cpu with best_sibling_cpu when the power cost is same.
When the power table is configured incorrectly or static_cpu_pwr_cost/
static_cluster_pwr_cost tunables are set to a large value, the
power_cost() for all candidate CPUs can return INT_MAX. So the
stats.min_cost is never changed from it's initial value i.e INT_MAX.

In the above scenario, we find stats.best_cpu >= 0 &&  stats.min_cost =
stats.best_sibling_cpu_cost = INT_MAX && stats.best_sibling_cpu_cost = -1
and replace best_cpu with best_sibling_cpu i.e -1.

Change-Id: I09829e278e41daaaff959428ff50927aba29104c
Signed-off-by: Pavankumar Kondeti <pkondeti@codeaurora.org>
kernel/sched/fair.c

index 9abc3e6..ef00eaf 100644 (file)
@@ -3240,7 +3240,8 @@ retry:
                        sbc_flag |= SBC_FLAG_IDLE_LEAST_LOADED;
                }
        } else if (stats.best_cpu >= 0) {
-               if (stats.best_cpu != task_cpu(p) &&
+               if (stats.best_sibling_cpu >= 0 &&
+                               stats.best_cpu != task_cpu(p) &&
                                stats.min_cost == stats.best_sibling_cpu_cost) {
                        stats.best_cpu = stats.best_sibling_cpu;
                        sbc_flag |= SBC_FLAG_BEST_SIBLING;