• Peter Williams's avatar
    [PATCH] sched: Avoid unnecessarily moving highest priority task move_tasks() · 615052dc
    Peter Williams authored
    Problem:
    
    To help distribute high priority tasks evenly across the available CPUs
    move_tasks() does not, under some circumstances, skip tasks whose load
    weight is bigger than the designated amount.  Because the highest priority
    task on the busiest queue may be on the expired array it may be moved as a
    result of this mechanism.  Apart from not being the most desirable way to
    redistribute the high priority tasks (we'd rather move the second highest
    priority task), there is a risk that this could set up a loop with this
    task bouncing backwards and forwards between the two queues.  (This latter
    possibility can be demonstrated by running a nice==-20 CPU bound task on an
    otherwise quiet 2 CPU system.)
    
    Solution:
    
    Modify the mechanism so that it does not override skip for the highest
    priority task on the CPU.  Of course, if there are more than one tasks at
    the highest priority then it will allow the override for one of them as
    this is a desirable redistribution of high priority tasks.
    Signed-off-by: default avatarPeter Williams <pwil3058@bigpond.com.au>
    Cc: Ingo Molnar <mingo@elte.hu>
    Cc: "Siddha, Suresh B" <suresh.b.siddha@intel.com>
    Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
    615052dc
sched.c 160 KB