calculate_imbalance函数对于该版本的kernel在网上没有找到相同的code,所以这里只是通过他的注释来确认。
calculate_imbalance
/**
* calculate_imbalance - Calculate the amount of imbalance present(当下的) within the
* groups of a given sched_domain during load balance.
* @env: load balance environment
* @sds: statistics of the sched_domain whose imbalance is to be calculated.
*/
static inline void calculate_imbalance(struct lb_env *env, struct sd_lb_stats *sds)
{
unsigned long max_pull, load_above_capacity = ~0UL;
struct sg_lb_stats *local, *busiest;
local = &sds->local_stat;
busiest = &sds->busiest_stat;
if (busiest->group_type == group_imbalanced) {
/*
* In the group_imb case we cannot rely on group-wide averages
* to ensure cpu-load equilibrium(平衡), look at wider averages. XXX
*/
/*
在group_imb的情况下,我们不能依靠整个组的平均值来确保cpu-load均衡,
而要查看更宽的平均值
*/
busiest->load_per_task =
min(busiest->load_per_task, sds->avg_load);
}
/*
* Avg load of busiest sg can be less and avg load of local sg can
* be greater than avg load across all sgs of sd because avg load
* factors in sg capacity and sgs with smaller group_type are
* skipped when updating the busiest sg:
*/
/*
最繁忙的sg的平均负载可以较小,本地sg的平均负载可以大于sd的所有sg的平均负载,
这是因为更新最繁忙的sg时会跳过sg容量和具有较小group_type的sg的平均负载因子:
*/
if (busiest->group_type != group_misfit_task &&
(busiest->avg_load <= sds->avg_load ||
local->avg_load >= sds->avg_load)) {
env->imbalance = 0;//已经平衡
return fix_small_i