scheduler fixes
Linus,
Please pull the latest sched-fixes-for-linus git tree from:
git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip.git sched-fixes-for-linus
Thanks,
Ingo
------------------>
Ken Chen (2):
sched: Fix sched-domain avg_load calculation
sched: Fix erroneous all_pinned logic
kernel/sched_fair.c | 14 ++++++-------- 1 files changed, 6 insertions(+), 8 deletions(-)
kernel/sched_fair.c +6 -8
@@ -2104,21 +2104,20 @@ balance_tasks(struct rq *this_rq, int this_cpu, struct rq *busiest, enum cpu_idle_type idle, int *all_pinned, int *this_best_prio, struct cfs_rq *busiest_cfs_rq) { - int loops = 0, pulled = 0, pinned = 0; + int loops = 0, pulled = 0;long rem_load_move = max_load_move;struct task_struct *p, *n;if (max_load_move ==0 ) goto out; - pinned =1 ; -list_for_each_entry_safe (p, n, &busiest_cfs_rq->tasks, se.group_node) {if (loops++ > sysctl_sched_nr_migrate)break ;if ((p->se.load.weight >>1 ) > rem_load_move || - !can_migrate_task (p, busiest, this_cpu, sd, idle, &pinned)) + !can_migrate_task (p, busiest, this_cpu, sd, idle, + all_pinned))continue ;pull_task (busiest, p, this_rq, this_cpu);
@@ -2153,9 +2152,6 @@ out:*/ schedstat_add (sd, lb_gained[idle], pulled); -if (all_pinned) - *all_pinned = pinned; -return max_load_move - rem_load_move; }
@@ -3127,6 +3123,8 @@ find_busiest_group(struct sched_domain *sd, int this_cpu,if (!sds.busiest || sds.busiest_nr_running ==0 ) goto out_balanced; + sds.avg_load = (SCHED_LOAD_SCALE * sds.total_load) / sds.total_pwr; +/* * If the busiest group is imbalanced the below checks don't * work because they assumes all things are equal, which typically
@@ -3151,7 +3149,6 @@ find_busiest_group(struct sched_domain *sd, int this_cpu,* Don't pull any tasks if this group is already above the domain * average load. */ - sds.avg_load = (SCHED_LOAD_SCALE * sds.total_load) / sds.total_pwr;if (sds.this_load >= sds.avg_load) goto out_balanced;
@@ -3340,6 +3337,7 @@ redo:* still unbalanced. ld_moved simply stays zero, so it is * correctly treated as an imbalance. */ + all_pinned =1 ;local_irq_save (flags);double_rq_lock (this_rq, busiest); ld_moved = move_tasks(this_rq, this_cpu, busiest,