Messages in this thread | | | Subject | Re: [PATCH 3/3] sched: terminate newidle balancing once at least one task has moved over | From | Peter Zijlstra <> | Date | Tue, 24 Jun 2008 12:13:26 +0200 |
| |
On Mon, 2008-06-23 at 17:04 -0600, Gregory Haskins wrote: > Inspired by Peter Zijlstra. > > Signed-off-by: Gregory Haskins <ghaskins@novell.com> > --- > > kernel/sched.c | 4 ++++ > 1 files changed, 4 insertions(+), 0 deletions(-) > > diff --git a/kernel/sched.c b/kernel/sched.c > index 3efbbc5..c8e8520 100644 > --- a/kernel/sched.c > +++ b/kernel/sched.c > @@ -2775,6 +2775,10 @@ static int move_tasks(struct rq *this_rq, int this_cpu, struct rq *busiest, > max_load_move - total_load_moved, > sd, idle, all_pinned, &this_best_prio); > class = class->next; > + > + if (idle == CPU_NEWLY_IDLE && this_rq->nr_running) > + break; > + > } while (class && max_load_move > total_load_moved); > > return total_load_moved > 0;
right,.. uhm, except that you forgot all the other fixes and generalizations I had,..
The LB_START/LB_COMPLETE stuff is needed to fix CFS load balancing. It now always iterates the first sysctl_sched_nr_migrate tasks, and if it doesn't find any there, just gives up - which isn't too big of a problem with it set to 32, but if you drop it to 2/4 stuff starts valing apart.
And the break I had here, only checks classes above and equal to the current class.
This again is needed when you have more classes.
| |