sched/fair: Fix negative imbalance in imbalance calculation
authorAubrey Li <aubrey.li@intel.com>
Thu, 26 Mar 2020 05:42:29 +0000 (13:42 +0800)
committerIngo Molnar <mingo@kernel.org>
Wed, 8 Apr 2020 09:35:20 +0000 (11:35 +0200)
A negative imbalance value was observed after imbalance calculation,
this happens when the local sched group type is group_fully_busy,
and the average load of local group is greater than the selected
busiest group. Fix this problem by comparing the average load of the
local and busiest group before imbalance calculation formula.

Suggested-by: Vincent Guittot <vincent.guittot@linaro.org>
Reviewed-by: Phil Auld <pauld@redhat.com>
Reviewed-by: Vincent Guittot <vincent.guittot@linaro.org>
Acked-by: Mel Gorman <mgorman@suse.de>
Signed-off-by: Aubrey Li <aubrey.li@linux.intel.com>
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Signed-off-by: Ingo Molnar <mingo@kernel.org>
Link: https://lkml.kernel.org/r/1585201349-70192-1-git-send-email-aubrey.li@intel.com
kernel/sched/fair.c

index 95cbd9e7958ddbbaf93e3d4093e2f42175930d70..02f323b85b6d3a41441a8159ac294db0a9f89815 100644 (file)
@@ -9036,6 +9036,14 @@ static inline void calculate_imbalance(struct lb_env *env, struct sd_lb_stats *s
 
                sds->avg_load = (sds->total_load * SCHED_CAPACITY_SCALE) /
                                sds->total_capacity;
+               /*
+                * If the local group is more loaded than the selected
+                * busiest group don't try to pull any tasks.
+                */
+               if (local->avg_load >= busiest->avg_load) {
+                       env->imbalance = 0;
+                       return;
+               }
        }
 
        /*