diff options
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/sched.c | 50 |
1 files changed, 42 insertions, 8 deletions
diff --git a/kernel/sched.c b/kernel/sched.c index 5f21658b0f67..9f8506d68fdc 100644 --- a/kernel/sched.c +++ b/kernel/sched.c | |||
| @@ -3676,10 +3676,30 @@ static inline void calculate_imbalance(struct sd_lb_stats *sds, int this_cpu, | |||
| 3676 | } | 3676 | } |
| 3677 | /******* find_busiest_group() helpers end here *********************/ | 3677 | /******* find_busiest_group() helpers end here *********************/ |
| 3678 | 3678 | ||
| 3679 | /* | 3679 | /** |
| 3680 | * find_busiest_group finds and returns the busiest CPU group within the | 3680 | * find_busiest_group - Returns the busiest group within the sched_domain |
| 3681 | * domain. It calculates and returns the amount of weighted load which | 3681 | * if there is an imbalance. If there isn't an imbalance, and |
| 3682 | * should be moved to restore balance via the imbalance parameter. | 3682 | * the user has opted for power-savings, it returns a group whose |
| 3683 | * CPUs can be put to idle by rebalancing those tasks elsewhere, if | ||
| 3684 | * such a group exists. | ||
| 3685 | * | ||
| 3686 | * Also calculates the amount of weighted load which should be moved | ||
| 3687 | * to restore balance. | ||
| 3688 | * | ||
| 3689 | * @sd: The sched_domain whose busiest group is to be returned. | ||
| 3690 | * @this_cpu: The cpu for which load balancing is currently being performed. | ||
| 3691 | * @imbalance: Variable which stores amount of weighted load which should | ||
| 3692 | * be moved to restore balance/put a group to idle. | ||
| 3693 | * @idle: The idle status of this_cpu. | ||
| 3694 | * @sd_idle: The idleness of sd | ||
| 3695 | * @cpus: The set of CPUs under consideration for load-balancing. | ||
| 3696 | * @balance: Pointer to a variable indicating if this_cpu | ||
| 3697 | * is the appropriate cpu to perform load balancing at this_level. | ||
| 3698 | * | ||
| 3699 | * Returns: - the busiest group if imbalance exists. | ||
| 3700 | * - If no imbalance and user has opted for power-savings balance, | ||
| 3701 | * return the least loaded group whose CPUs can be | ||
| 3702 | * put to idle by rebalancing its tasks onto our group. | ||
| 3683 | */ | 3703 | */ |
| 3684 | static struct sched_group * | 3704 | static struct sched_group * |
| 3685 | find_busiest_group(struct sched_domain *sd, int this_cpu, | 3705 | find_busiest_group(struct sched_domain *sd, int this_cpu, |
| @@ -3697,17 +3717,31 @@ find_busiest_group(struct sched_domain *sd, int this_cpu, | |||
| 3697 | update_sd_lb_stats(sd, this_cpu, idle, sd_idle, cpus, | 3717 | update_sd_lb_stats(sd, this_cpu, idle, sd_idle, cpus, |
| 3698 | balance, &sds); | 3718 | balance, &sds); |
| 3699 | 3719 | ||
| 3720 | /* Cases where imbalance does not exist from POV of this_cpu */ | ||
| 3721 | /* 1) this_cpu is not the appropriate cpu to perform load balancing | ||
| 3722 | * at this level. | ||
| 3723 | * 2) There is no busy sibling group to pull from. | ||
| 3724 | * 3) This group is the busiest group. | ||
| 3725 | * 4) This group is more busy than the avg busieness at this | ||
| 3726 | * sched_domain. | ||
| 3727 | * 5) The imbalance is within the specified limit. | ||
| 3728 | * 6) Any rebalance would lead to ping-pong | ||
| 3729 | */ | ||
| 3700 | if (balance && !(*balance)) | 3730 | if (balance && !(*balance)) |
| 3701 | goto ret; | 3731 | goto ret; |
| 3702 | 3732 | ||
| 3703 | if (!sds.busiest || sds.this_load >= sds.max_load | 3733 | if (!sds.busiest || sds.busiest_nr_running == 0) |
| 3704 | || sds.busiest_nr_running == 0) | 3734 | goto out_balanced; |
| 3735 | |||
| 3736 | if (sds.this_load >= sds.max_load) | ||
| 3705 | goto out_balanced; | 3737 | goto out_balanced; |
| 3706 | 3738 | ||
| 3707 | sds.avg_load = (SCHED_LOAD_SCALE * sds.total_load) / sds.total_pwr; | 3739 | sds.avg_load = (SCHED_LOAD_SCALE * sds.total_load) / sds.total_pwr; |
| 3708 | 3740 | ||
| 3709 | if (sds.this_load >= sds.avg_load || | 3741 | if (sds.this_load >= sds.avg_load) |
| 3710 | 100*sds.max_load <= sd->imbalance_pct * sds.this_load) | 3742 | goto out_balanced; |
| 3743 | |||
| 3744 | if (100 * sds.max_load <= sd->imbalance_pct * sds.this_load) | ||
| 3711 | goto out_balanced; | 3745 | goto out_balanced; |
| 3712 | 3746 | ||
| 3713 | sds.busiest_load_per_task /= sds.busiest_nr_running; | 3747 | sds.busiest_load_per_task /= sds.busiest_nr_running; |
