|
@@ -7073,6 +7073,17 @@ group_is_overloaded(struct lb_env *env, struct sg_lb_stats *sgs)
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
+/*
|
|
|
+ * group_smaller_cpu_capacity: Returns true if sched_group sg has smaller
|
|
|
+ * per-CPU capacity than sched_group ref.
|
|
|
+ */
|
|
|
+static inline bool
|
|
|
+group_smaller_cpu_capacity(struct sched_group *sg, struct sched_group *ref)
|
|
|
+{
|
|
|
+ return sg->sgc->min_capacity * capacity_margin <
|
|
|
+ ref->sgc->min_capacity * 1024;
|
|
|
+}
|
|
|
+
|
|
|
static inline enum
|
|
|
group_type group_classify(struct sched_group *group,
|
|
|
struct sg_lb_stats *sgs)
|
|
@@ -7176,6 +7187,20 @@ static bool update_sd_pick_busiest(struct lb_env *env,
|
|
|
if (sgs->avg_load <= busiest->avg_load)
|
|
|
return false;
|
|
|
|
|
|
+ if (!(env->sd->flags & SD_ASYM_CPUCAPACITY))
|
|
|
+ goto asym_packing;
|
|
|
+
|
|
|
+ /*
|
|
|
+ * Candidate sg has no more than one task per CPU and
|
|
|
+ * has higher per-CPU capacity. Migrating tasks to less
|
|
|
+ * capable CPUs may harm throughput. Maximize throughput,
|
|
|
+ * power/energy consequences are not considered.
|
|
|
+ */
|
|
|
+ if (sgs->sum_nr_running <= sgs->group_weight &&
|
|
|
+ group_smaller_cpu_capacity(sds->local, sg))
|
|
|
+ return false;
|
|
|
+
|
|
|
+asym_packing:
|
|
|
/* This is the busiest node in its class. */
|
|
|
if (!(env->sd->flags & SD_ASYM_PACKING))
|
|
|
return true;
|